我刚开始学习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"
的引用,因此可以对它们进行比较并始终相等(因为'公共字符串池')。
我的问题是:如何将包含引用的s
与实际的字符串"Hello"
进行比较?有没有逻辑,或者它只是处理内存引用的实现,然后比较两个??
如果我的理解错误,请纠正我......
答案 0 :(得分:6)
我的问题是:如何将包含引用的''与实际的字符串进行比较" Hello"这是一个字符序列?
"Hello"
不是字符序列。它是String
。 (String
确实实现了CharSequence
interface,但这不是同一回事。)所以,当您使用equals
或==
时,您和&String
#39;重新比较String
个实例,而不是一些特殊的事情。 String
文字是一个equals
(完整地引用了文字在源中的文字)。
起初好像你对==
和equals
感到困惑。重新阅读,我不确定你是谁,但为了以防万一:String
比较两个对象的等价性;如果两个对象是true
s,如果它们具有相同的字符序列,则返回==
。 true
比较两个对象引用,如果它们指向同一个对象,则评估==
。对于看似不同的true
个对象,String
有时会String
,因为==
文字是隐式intern
'd(放在公共池中并从中重用)到保存内存,因此两个独立但等效的文字实际上最终会引用同一个对象。 从不依赖于此。使用String
来比较equals
几乎总是一个错误(它不是非常多的边缘情况)。使用{{1}}。
答案 1 :(得分:3)
您正在调用equals
方法,该方法将两个对象进行比较以进行等效 - 它不检查两个引用是否与对象的同一实例相对应。要检查对同一对象的两个引用,请使用s == s1
答案 2 :(得分:2)
如果您看到equals
的源代码,您可以理解equals方法比较每个字符串的值
字符。如果您使用的==
只会比较引用。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
答案 3 :(得分:0)
当调用equals
方法时,进入堆栈的东西是对传递的任何内容的引用。因此,当您编写s.equals("Hello")
时,堆栈中的一个内容就是对"Hello"
的引用。
答案 4 :(得分:0)
我的问题是:如何将具有参考价值的s与之相比较 实际字符串“Hello”,这是一个字符序列??有没有 逻辑或它只是处理内存的实现 引用然后比较两个??
检查字符串是否相等的算法包括:
以下是String类中.equals()
方法的默认实现:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
要检查对同一对象的两个引用,您将使用s == s1。
要使用.equals()
方法比较两个值。