为什么 class 测试两个不同对象的变量对 == 操作给出 true 而对字符串对象相同的操作结果为 false?

Why does variables of class Test for two different objects gives true for == operation and same operation results in false for String Objects?

对于使用 new 创建的两个不同对象 s 和 p 的 String 变量的 == 操作给出的结果为 false(第 1 行),我理解但为什么第 3 行和第 4 行(行号注释)给出 true 作为输出?

我知道 == 用于参考比较,这就是我怀疑它是否用于参考比较的地方,那么为什么第 4 行给出 true,因为 j 是一个整数并且没有不变性概念,因为对于 String ( String s ) 并且每次都必须创建一个新对象?

    class World
{
    public static void main(String[] args)
    {   
        String s=new String("B");
        String p=new String("B");
        System.out.println(s==p);                    //false    line 1
        Test t1= new Test("A",4);
        Test t2= new Test("A",4);
        System.out.println(t1==t2);                 //false     line 2
        System.out.println(t1.s==t2.s);             //true      line 3
        System.out.println(t1.j==t2.j);             //true      line 4
    }
}

class Test
{
    String s;
    int j;
    Test(String s, int j)
    {
    this.s=s;
    this.j=j;
    }
}

在 Java 中,对两个整数使用 == 运算符按值比较它们。同时在两个字符串或两个 class 上使用 == 比较它们在内存中的位置,而不是它们的值。 您在测试 class 中需要小心,因为您将 class 字段命名为与您的参数相同的名称,因此您实际上可能不会将 j 和 s 的值分配给您认为的值。 尝试将构造函数更改为

Test(String str, int i){
    s = str;
    j = i;
}

字符串通常缓存在java中,因此具有相同值的两个字符串可能具有相同的引用。 (整数也是如此,如果它们具有相同的值,则一定范围内的对象被引用为相同的对象)。这可能导致构造函数中 t1 和 t2 的对象 "A" 与 s 的值相同。如果两个 int 原语具有相同的值,则它们始终相同。