java中的面试问题

java中的面试问题,java,Java,我试过了,结果它打印了FALSE,我想知道确切的原因 提前感谢。它会打印FALSE =操作符比较对象引用,a和b是对两个不同对象的引用,因此FALSE 圭多说: 此外,引用不同,因为字符串是使用新运算符创建的。如果将它们创建为String a=“TEST”;字符串b=“测试”那么输出可能是TRUE,因为JVM会检查它保存的字符串池中是否存在匹配的字符串对象,因此相同的对象将被重用。代码将打印为FALSE。代码的更正版本将使用.equals()而不是== String a = new String

我试过了,结果它打印了
FALSE
,我想知道确切的原因


提前感谢。

它会打印
FALSE

=
操作符比较对象引用,
a
b
是对两个不同对象的引用,因此
FALSE

圭多说:

此外,引用不同,因为字符串是使用新运算符创建的。如果将它们创建为
String a=“TEST”;字符串b=“测试”
那么输出可能是
TRUE
,因为JVM会检查它保存的字符串池中是否存在匹配的字符串对象,因此相同的对象将被重用。

代码将打印为FALSE。代码的更正版本将使用.equals()而不是==

String a = new String ("TEST");
String b = new String ("TEST");

if(a == b) { 
  System.out.println ("TRUE"); 
} else {
 System.out.println ("FALSE"); 
}

为了让它完整:

String a = new String ("TEST");

String b = new String ("TEST");

if(a.equals(b)) { 
  s.o.p ("TRUE"); 
} else {
 s.o.p ("FALSE"); 
}
在大多数情况下,这将返回
true

这就是原因:

String a = new String ("TEST").intern();

String b = new String ("TEST").intern();

System.out.println(a == b);

创建新对象(字符串或任何其他对象)时,返回的是该新对象的值引用的副本

当两个对象具有相同的引用时,
=
操作符将计算为true


如果两个字符串变量指向同一对象,则这两个变量称为同一对象的引用


因此,如果您希望以编程方式检查此比较,将使用==运算符。如果两个变量引用了同一对象,则此运算符返回值,如果没有,则返回

这里我们使用两个新关键字。对于每个新关键字,都会生成一个新对象


=
方法检查对象的
hashcode
,在这种情况下,我们得到
false
作为答案。

您认为这是什么?(提示:抓起一个文本编辑器和一个编译器,找出答案)然后问:“我得到了这个,但我想我会得到的..为什么是它等等”你可以试一下并发布输出,然后问为什么是输出。实际上,我会说它不会编译..什么是
s.o.p
?讽刺的laugh@scheffield.. 我认为您不理解“sarcastic”这个词:从理论上讲,引用是不同的,因为字符串是使用新操作符创建的。如果将它们创建为字符串a=“TEST”;字符串b=“测试”;然后,输出可能是真的,因为JVM检查它保留的字符串池中是否存在匹配的字符串对象,因此相同的对象将被重用。这将是真的,而不是“可能”。@Thorbjørn 100%确定吗?Java/JVM规范是否规定字符串池是强制性的,以及关于其大小或字符串引用必须保留多长时间的任何内容?我不知道为什么,但我的直觉表明它只有99.9999%的把握。@Guido,从第3.10.5节“字符串文字,或者更一般地说,作为常量表达式(§15.28)值的字符串”被“插入”,以便使用方法String.intern共享唯一的实例。“。在您的示例中,两个“TEST”是字符串文本。这很合理,但正如Alberto已经解释的那样,我只是添加了如何更正它。下次我将引用另一个答案。是的,但这只适用于字符串文本,因为它们重用对象。一般情况下,
等于
应优先于
=
。适用于任何插入字符串,文字或其他。然而,依靠这种行为是个坏主意。equals()是最好的用法。您的两个选项都是正确的。我只是想证明,有可能使用对象相等。这同样适用于
Integer.valueOf(200)=Integer.valueOf(200)。。。
public static void main(String [] args) {
    // will return true
    System.out.println(compare("TEST", "TEST"));
}

public static boolean compare (String a, String b) {
    return a == b;
}
Object o = new Object();
Object p = o; //<-- assigning the same reference value
System.out.println("o == p ? " + (o == p ) ); //<-- true
Object a = new Object();
Object b = new Object();
System.out.println("o == p ? " + (o == p ) ); //<-- false
String x = "hello";
String y = "hello";

System.out.println("x == y ? " + (x == y ) ); //<-- true
 String a = "world";
 String b = new String("world");
 String c = new String("world").intern();//<-- returns the reference value in the pool.


 System.out.println("a == b ? "  + (a==b) ); //<-- false
 System.out.println("b == c ? "  + (b==c) ); //<-- false
 System.out.println("a == c ? "  + (a==c) ); // true!