我刚开始学习 Java 并遇到了这个:
String s = "Hello";
String s1 = "Hello";
if(s.equals("Hello") && s.equals(s1))
{
System.out.println("Equal");
}
if
语句中的第一个条件将字符串文字 s
与字符序列进行比较,而第二个语句将 s
与另一个字符串进行比较文字 s1
。两种比较结果都是正确的。
我的理解是 s
将保存对 "Hello"
的引用,s1
也是如此。由于 s
和 s1
都包含对 "Hello"
的引用,因此可以比较它们并且它们总是相等的(因为 'common string pool' ).
我的问题是:保存引用的 s
如何与作为字符序列的实际字符串 "Hello"
进行比较?是否有任何逻辑或只是实现处理内存引用然后比较两者??
如果我的理解有误,请指正...
最佳答案
My question is: How can 's', which holds a reference, be compared to the actual string "Hello" which is a character sequence?
"Hello"
不是字符序列。这是一个 String
。 (String
确实实现了 CharSequence
interface ,但这不是一回事。)因此,当您使用 equals
或 ==
时,您正在比较 String
实例,而不是一些特殊的东西。 String
文字是一个String
(在文字写入源代码的地方加上对它的引用)。
起初您似乎对 equals
和 ==
感到困惑。重新阅读,我不确定你是不是,但以防万一:equals
比较两个对象的等价性;如果这两个对象是 String
,并且它们具有相同的字符序列,则返回 true
。 ==
比较两个对象引用,如果它们指向同一对象,则评估为true
。对于看似不同的 String
对象,==
有时是 true
,因为 String
文字隐式为 intern
'd (放入一个公共(public)池中并从中重复使用)以节省内存,因此两个独立但等效的文字实际上最终指向同一个对象。 永远不要依赖它。使用 ==
来比较 String
几乎总是一个错误(不是的情况是非常边缘的情况)。使用 equals
。
关于java - Java 中的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20879256/