这个问题的答案是community effort。编辑现有答案以改进此帖子。它目前不接受新的答案或互动。
到目前为止,我一直在程序中使用==
运算符来比较所有字符串。然而,我遇到了一个错误,将其中一个更改为.equals()
,并修复了该错误。==
坏吗?什么时候应该使用,什么时候不应该使用?有什么区别?
这个问题的答案是community effort。编辑现有答案以改进此帖子。它目前不接受新的答案或互动。
到目前为止,我一直在程序中使用==
运算符来比较所有字符串。然而,我遇到了一个错误,将其中一个更改为.equals()
,并修复了该错误。==
坏吗?什么时候应该使用,什么时候不应该使用?有什么区别?
23条答案
按热度按时间x3naxklr1#
在Java中,当
==
运算符用于比较两个对象时,它会检查对象是否引用内存中的相同位置。换句话说,它检查两个对象名是否基本上是对相同内存位置的引用。Java
String
类实际上覆盖了Object
类中的默认equals()
实现——它覆盖了方法,因此它只检查字符串的值,而不是它们在内存中的位置。这意味着,如果调用equals()
方法来比较两个String
对象,则只要实际的字符序列相等,两个对象都被视为相等。==
运算符检查两个字符串是否完全相同。.equals()
方法检查两个字符串是否具有相同的值。rfbsl7qr2#
还可以使用
compareTo()
方法比较两个字符串。如果compareTo结果为0,则两个字符串相等,否则被比较的字符串不相等。==
比较参考值,而不比较实际字符串。如果确实使用new String(somestring).intern()
创建了每个字符串,则可以使用==
运算符比较两个字符串,否则只能使用equals()或compareTo方法。pnwntuvh3#
所有对象都保证具有
.equals()
方法,因为对象包含返回布尔值的方法.equals()
。如果需要进一步定义,则子类的任务是重写此方法。如果没有它(即使用==
),则仅检查两个对象之间的内存地址是否相等。String覆盖了这个.equals()
方法,它不使用内存地址,而是返回字符级别的字符串比较,以获得相等性。需要注意的是,字符串存储在一个块池中,因此一旦创建了字符串,它将永远存储在同一地址的程序中。字符串不会更改,它们是不可变的。这就是为什么如果您有大量的字符串处理要做,那么使用常规字符串连接是一个坏主意。相反,您将使用提供的
StringBuilder
类。请记住,指向该字符串的指针可以更改,如果您有兴趣查看两个指针是否相同,==
将是一个不错的选择。字符串本身并不是。lsmd5eda4#
运算符*==始终用于对象引用比较,而字符串类。为内容比较重写了equals()*方法:
wlwcrazw5#
如果
equals()
方法存在于java.lang.Object
类中,则应检查对象状态的等价性!这意味着对象的内容。而==
操作员应检查实际对象示例是否相同。考虑两个不同的参考变量
str1
和str2
:如果您使用
equals()
如果使用
==
,您将获得TRUE
输出。现在您将获得
FALSE
作为输出,因为str1
和str2
都指向两个不同的对象,尽管它们共享相同的字符串内容。因为new String()
,每次都会创建一个新对象。zwghvu4y6#
我认为,当您定义
String
时,您定义了一个对象。因此,您需要使用.equals()
。使用基本数据类型时,使用==
,但对于String
(和任何对象),必须使用.equals()
。dldeef677#
==
比较对象的参考值,而java.lang.String
类中存在的equals()
方法比较String
对象(与另一个对象)的内容。ccrfmcuu8#
Java有一个字符串池,Java在其中管理字符串对象的内存分配。见String Pools in Java
当您使用
==
运算符检查(比较)两个对象时,它会将地址相等性与字符串池进行比较。如果两个字符串对象具有相同的地址引用,则返回true
,否则返回false
。但是,如果要比较两个字符串对象的内容,则必须覆盖equals
方法。equals
实际上是对象类的方法,但它被重写为字符串类,并给出了一个新的定义,用于比较对象的内容。但请注意,它尊重字符串的情况。如果要进行不区分大小写的比较,则必须使用String类的equalsIgnoreCase方法。
让我们看看:
cqoc49vn9#
我同意zacherates的回答。
但您可以在非文字字符串上调用
intern()
。来自zacherates的例子:
如果您将非文字字符串相等性设为
true
:col17t5w10#
==
比较Java中的对象引用,String
对象也不例外。为了比较对象(包括
String
)的实际内容,必须使用equals
方法。如果使用
==
对两个String
对象进行比较,结果是true
,这是因为String
对象是内部的,并且Java虚拟机具有指向String
的同一示例的多个引用。不应期望使用==
将包含相同内容的一个String
对象与另一个String
对象进行比较,以评估为true
。am46iovg11#
.equals()
比较类中的数据(假设实现了函数)。==
比较指针位置(对象在内存中的位置)。如果两个对象(不谈论基元)都指向同一个对象示例,则
==
返回true。如果两个对象包含相同的数据equals()
Versus==
in Java,则.equals()
返回true这可能对你有帮助。
ivqmmu1c12#
==
执行引用相等性检查,检查两个对象(本例中的字符串)是否引用内存中的同一对象。equals()
方法将检查两个对象的内容或状态是否相同。显然,
==
速度更快,但如果您只想知道两个E1D3D1E是否包含相同的文本,则在许多情况下可能会给出错误结果。当然,建议使用
equals()
方法。不要担心性能。鼓励使用
String.equals()
的一些事项:1.
String.equals()
的实现首先检查引用相等性(使用==
),如果两个字符串通过引用相同,则不执行进一步的计算!1.如果两个字符串引用不相同,
String.equals()
接下来将检查字符串的长度。这也是一个快速操作,因为String
类存储字符串的长度,不需要计算字符或代码点。如果长度不同,则不进行进一步检查,因为我们知道它们不可能相等。1.只有到目前为止,我们才会实际比较两个字符串的内容,这将是一个简单的比较:不是所有字符都会比较,如果我们发现不匹配的字符(在两个字符串中的相同位置),则不会检查更多字符。
当一切都说了算,即使我们保证字符串是实习生,使用
equals()
方法仍然不是人们可能认为的开销,绝对是推荐的方法。如果您希望进行有效的引用检查,则在语言规范和实现保证相同的枚举值将是同一对象(通过引用)的情况下使用枚举。mkh04yzy13#
如果你和我一样,当我第一次开始使用Java时,我想使用“==”操作符来测试两个字符串示例是否相等,但不管是好是坏,在Java中这不是正确的方法。
在本教程中,我将演示几种不同的方法来正确比较Java字符串,首先是我大多数时候使用的方法。在本Java字符串比较教程的最后,我还将讨论为什么在比较Java字符串时“==”运算符不起作用。
选项1:Java字符串与equals方法比较大多数情况下(可能95%的情况下),我将字符串与Java字符串类的equals进行比较,如下所示:
这个String equals方法查看两个Java字符串,如果它们包含完全相同的字符串,则认为它们相等。
查看一个使用equals方法的快速字符串比较示例,如果运行以下测试,两个字符串将不会被视为相等,因为字符不完全相同(字符的大小写不同):
但是,当两个字符串包含完全相同的字符串时,equals方法将返回true,如下例所示:
选项2:与equalsIgnoreCase方法进行字符串比较
在一些字符串比较测试中,您需要忽略字符串是大写还是小写。当您希望以这种不区分大小写的方式测试字符串的相等性时,请使用String类的equalsIgnoreCase方法,如下所示:
选项3:使用compareTo方法进行Java字符串比较
还有第三种比较Java字符串的不太常见的方法,即字符串类compareTo方法。如果两个字符串完全相同,则compareTo方法将返回值0(零)。下面是这个字符串比较方法的一个快速示例:
当我在写Java中的平等概念时,需要注意的是Java语言在基本Java对象类中包含了一个equals方法。每当您创建自己的对象,并且希望提供一种方法来查看对象的两个示例是否“相等”时,您应该在类中重写(并实现)这个equals方法(就像Java语言在字符串equals中提供这种相等/比较行为一样)。
您可能想看看这个==, .equals(), compareTo(), and compare()
fumotvh314#
功能:
测试:
9ceoxa9215#
==
操作员检查两个参考是否指向同一对象。.equals()
检查实际字符串内容(值)。注意,
.equals()
方法属于类Object
(所有类的超类)。您需要根据您的类要求重写它,但对于字符串,它已经实现,并且它检查两个字符串是否具有相同的值。*案例1
原因:不为空创建的字符串文本存储在堆的permgen区域的字符串池中。因此s1和s2都指向池中的相同对象。
*案例2
原因:如果使用
new
关键字创建字符串对象,则会在堆上为其分配单独的空间。