Java面试问题

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

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

我尝试了一下,它打印出了“FALSE”,我想确切地知道原因。提前致谢。

2
你认为这是什么?(提示:拿起一个文本编辑器和编译器去找出答案) - OscarRyz
2
然后问:“我得到了这个,但我以为我会得到那个...为什么会是这样等等。” - OscarRyz
1
你本可以尝试一下并发布输出结果,然后询问为什么会是这个输出结果。 - user529141
2
实际上,我会说它不会编译......什么是s.o.p讽刺的笑声 - Buhake Sindi
2
@scheffield.. 我猜你不懂得什么是“讽刺”这个词 :P - user529141
显示剩余2条评论
6个回答

14

它打印出FALSE

==运算符比较对象引用,ab是指向两个不同对象的引用,因此结果为FALSE

Guido 说:
此外,这些引用是不同的,因为字符串是使用new操作符创建的。如果你将它们创建为String a = "TEST"; String b = "TEST";,那么输出可能会是TRUE,因为JVM检查它保留的字符串池中是否存在匹配的字符串对象,所以将重复使用相同的对象。


7
此外,引用不同是因为字符串是使用new运算符创建的。如果你像这样创建它们:String a = "TEST"; String b = "TEST"; 那么输出结果可能是TRUE,因为JVM检查保留在字符串池中的匹配字符串对象的存在,所以将重用相同的对象。 - Guido
2
它将是真的,不是“可能”。 - Thorbjørn Ravn Andersen
1
@Thorbjørn 你确定100%吗?Java/JVM规范是否指定了字符串池是必需的,以及关于其大小或保留字符串引用的时间有什么规定?我不知道为什么,但我的直觉认为只有99.9999%的把握。 - Guido
3
@Guido,来自http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html第3.10.5节“字符串字面量-或者更普遍地说,是常量表达式的值(§15.28)-以便共享唯一实例,使用String.intern()方法进行“国际化(interne)”。在你的例子中,两个“TEST”是字符串字面量。 - Thorbjørn Ravn Andersen

1
代码将会打印出 FALSE。修正后的代码应该使用 .equals() 而不是 ==。
String a = new String ("TEST");

String b = new String ("TEST");

if(a.equals(b)) { 
  s.o.p ("TRUE"); 
} else {
 s.o.p ("FALSE"); 
}

好的,但是由于Alberto已经解释过了,我只是在补充如何纠正它。下次我会引用其他答案。 - Ljdawson

1

只是为了让它完整:

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

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

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

在大多数情况下,这将返回true

这就是原因:

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;
}

1
是的,但这仅适用于字符串字面量,因为它们重用对象。在一般情况下,应优先使用“equals”而不是“==”。 - Goran Jovic
适用于任何intern()的字符串,无论是字面还是其他。然而,依赖这种行为是一个不好的想法。equals()是最好使用的方法。 - Peter Lawrey
你们两个都是对的。我只是想展示一下使用对象相等性的可能性。同样适用于 Interger.valueOf(200) == Integer.valueOf(200);... - scheffield

1

当您创建一个新对象(无论是字符串还是其他任何类型),返回的是该新对象的值引用的副本。

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

例如:

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

但是你的例子中,你正在创建新对象,因此它们具有不同的引用值。

为了有效地比较字符串(或任何其他对象),您应该使用equals()方法。

字符串字面量默认情况下会被发送到一个字符串池中以提高性能。

如果您想利用这个池,可以调用intern()方法,它会返回池中的对象(如果存在)。

 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!

0
如果两个字符串变量指向同一对象,则这两个变量被称为指向同一对象的引用。因此,如果您想在程序中检查此比较,可以使用 "==" 运算符。如果两个变量引用相同的对象,则此运算符返回 true 值,如果它们不引用相同的对象,则返回 false 值。

-1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接