2017-10-14 50 views
-2

For ==对两个不同的对象s和p的变量使用new创建的结果作为false(行1),我知道但为什么行3和4(行号注释)给出true作为输出?为什么类Test的两个不同对象的变量为==操作赋予true,并且对于String对象而言,相同的操作会导致为false?

我知道这个事实,==是用于参考比较,这是我的疑问,如果它是为了参考比较,那么为什么第4行给出真正的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; 
    } 
} 
+4

“*为什么第3行和第4行给出正确,因为t1和t2是不同的对象*” - “t1”和“t2”是不同的对象,但您不在第3行比较它们。他们持有的琴弦,它们不是不同的物体。你有两个引用相同的字符串文字'“A”',这与你在's'和'p'做的显式创建新的'String'对象时有很大的不同。 – azurefrog

回答

1

字符串在java中通常缓存,所以两个字符串具有相同值可能具有相同的参考。 (对于整数也是一样,如果它们具有相同的值,则某个范围内的对象被引用为相同的对象)。这可能会导致与构造函数中的t1和t2的s值相同的对象“A”。如果两个int基元具有相同的值,它们总是相同的。

+0

你能解释一下这句话吗“整数也是一样的,如果它们具有相同的值,那么在一定范围内的对象被引用为同一对象” 根据我的理解,只有在自动装箱的情况下才会发生 –

+0

如果你有两个小整数:Integer i1 = Integer.valueOf(127);整数i2 = Integer.valueOf(127);比较将导致i1 == i2。如果你在缓存区域之外有两个整数,即Integer i1 = Integer.valueOf(1270); Integer i2 = Integer.valueOf(1270);那么比较会导致i1!= i2。您可以通过简单的单元测试来轻松验证这一点。或者请参阅https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int) – juwil

+0

中的规范,对于内部使用valueOf()的Autoboxing,方法,正如你所提到的,但在上面的例子中,两者都没有发生。 –

1

在Java中,使用==运算符对两个整数进行比较。同时在两个字符串上使用==,或者您的两个类将它们在内存中的位置进行比较,而不是它们的值。 你需要在Test类中小心,因为你将你的类字段命名为与你的参数相同的东西,所以你可能实际上不会将j和s的值赋值给你认为的东西。 试着改变你的构造函数

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

因为他用这个作业,所以不需要改变名字。这与问题无关。 – juwil

相关问题