// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
String fooString1 = new String("foo");
String fooString2 = new String("foo");
// Evaluates to false
fooString1 == fooString2;
// Evaluates to true
fooString1.equals(fooString2);
// Evaluates to true, because Java uses the same object
"bar" == "bar";
但是小心空值! == 手柄 null 很好,但是打电话 .equals() 空字符串将导致异常:
String nullString1 = null;
String nullString2 = null;
// Evaluates to true
System.out.print(nullString1 == nullString2);
// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));
String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
一定要弄清楚原因。这是因为 == 比较只比较参考文献;这个 equals() 方法对内容进行逐字比较。 当你打电话给新人 a 以及 b ,每一个都会得到一个指向 "foo" 在字符串表中。参考文献不同,但内容相同。
14条答案
按热度按时间bvpmtnay1#
对,
==
不利于比较字符串(任何对象,除非你知道它们是规范的)。==
只是比较对象引用。.equals()
平等测试。对于字符串,它们通常是相同的,但正如您所发现的,这并不总是可以保证的。oyjwcjzk2#
java中的字符串是不可变的。这意味着每当您尝试更改/修改字符串时,都会得到一个新示例。不能更改原始字符串。这样做是为了缓存这些字符串示例。一个典型的程序包含大量的字符串引用,缓存这些示例可以减少内存占用并提高程序的性能。
当使用==运算符进行字符串比较时,不是比较字符串的内容,而是实际比较内存地址。如果两者相等,则返回true和false,否则返回true和false。而字符串中的equals比较字符串内容。
所以问题是,如果所有的字符串都缓存在系统中,为什么呢
==
返回false而等于返回true?嗯,这是可能的。如果你做一根新的绳子String str = new String("Testing")
即使缓存中已经包含具有相同内容的字符串,也会在缓存中创建一个新字符串。简言之"MyString" == new String("MyString")
将始终返回false。java还讨论了函数intern(),该函数可用于字符串,使其成为缓存的一部分
"MyString" == new String("MyString").intern()
将返回true。注意:==运算符比equals快得多,这仅仅是因为您正在比较两个内存地址,但是您需要确保代码没有在代码中创建新的字符串示例。否则你会遇到虫子。
qlzsbp2j3#
这个
==
运算符检查两个字符串是否完全相同。这个
.equals()
方法将检查两个字符串是否具有相同的值。68de4m5k4#
是的,很糟糕。。。
==
意味着两个字符串引用是完全相同的对象。您可能听说过这样的情况,因为java保留了某种文字表(它确实如此),但情况并非总是这样。有些字符串是以不同的方式加载的,由其他字符串等构造而成,因此您决不能假定两个相同的字符串存储在同一位置。equals为你做真正的比较。
7uhlpewt5#
我同意zacherates的回答。
但你能做的就是打电话
intern()
在非文本字符串上。来自zacherates的例子:
如果你实习生的非文字字符串平等是
true
:3j86kqsm6#
如果你和我一样,当我第一次开始使用java时,我想使用“==”操作符来测试两个字符串示例是否相等,但不管是好是坏,这在java中都不是正确的方法。
在本教程中,我将演示几种正确使用com的不同方法
dzjeubhm7#
.equals()
比较类中的数据(假设函数已实现)。==
比较指针位置(对象在内存中的位置)。==
如果两个对象(不谈论原语)指向同一个对象示例,则返回true。.equals()
如果两个对象包含相同的数据,则返回trueequals()
与==
在java中那也许对你有帮助。
hmtdttj48#
==
测试引用相等性(是否为同一对象)。.equals()
测试值是否相等(逻辑上是否相等)。objects.equals()检查
null
打电话之前.equals()
所以您不必这样做(从jdk7开始提供,guava也提供)。因此,如果您想测试两个字符串是否具有相同的值,您可能需要使用
Objects.equals()
.你几乎总是想用
Objects.equals()
. 在极少的情况下,如果你知道你在处理内部字符串,你可以使用==
.来自jls 3.10.5。字符串文字:
此外,字符串文字总是引用类的同一示例
String
. 这是因为字符串文字-或者更一般地说,字符串是常量表达式的值(§15.28)-被“实习”以便使用该方法共享独特的示例String.intern
.类似的例子也可以在jls 3.10.5-1中找到。
需要考虑的其他方法
忽略大小写的string.equalsignorecase()值相等。
contentequals()比较
String
任何CharSequence
(自Java1.5起提供)。避免在进行相等比较之前将stringbuffer等转换为字符串,但将空检查留给您。qvtsj1bj9#
==
比较java中的对象引用,这也不例外String
物体。用于比较对象的实际内容(包括
String
),必须使用equals
方法。如果两个的比较
String
对象使用==
结果是true
,那是因为String
对象是内部对象,java虚拟机有多个引用指向同一个对象的示例String
. 我们不应该期望String
与另一个对象包含相同内容的对象String
对象使用==
评估为true
.brccelvz10#
java有一个字符串池,java在其中管理字符串对象的内存分配。请参见java中的字符串池
当您使用
==
运算符将地址相等性与字符串池进行比较。如果两个字符串对象具有相同的地址引用,则返回true
,否则false
. 但是,如果要比较两个字符串对象的内容,则必须重写equals
方法。equals
实际上是object类的方法,但是它被重写为string类,并且给出了一个新的定义来比较object的内容。但请注意,它尊重弦的情况。如果要进行不区分大小写的比较,则必须使用string类的equalsignorecase方法。
让我们看看:
dfty9e1911#
==
测试对象引用,.equals()
测试字符串值。有时看起来好像
==
比较值,因为java做了一些幕后工作,以确保相同的内联字符串实际上是同一个对象。例如:
但是小心空值!
==
手柄null
很好,但是打电话.equals()
空字符串将导致异常:如果你知道的话
fooString1
可能是空的,告诉读者以下内容较短,但不太明显的是它检查null:
yzckvree12#
一定要弄清楚原因。这是因为
==
比较只比较参考文献;这个equals()
方法对内容进行逐字比较。当你打电话给新人
a
以及b
,每一个都会得到一个指向"foo"
在字符串表中。参考文献不同,但内容相同。3zwtqj6y13#
==
执行引用相等性检查,检查这两个对象(本例中的字符串)是否引用内存中的同一对象。这个
equals()
方法将检查两个对象的内容或状态是否相同。很明显
==
速度更快,但在许多情况下,如果您只想判断2String
我们保持相同的文本。当然是使用
equals()
建议使用此方法。别担心表演。一些鼓励使用的东西
String.equals()
:实施
String.equals()
首先检查引用相等性(使用==
),如果两个字符串通过引用是相同的,则不执行进一步的计算!如果两个字符串引用不相同,
String.equals()
接下来将检查字符串的长度。这也是一个快速操作,因为String
类存储字符串的长度,不需要计算字符或代码点。如果长度不同,则不进行进一步检查,我们知道它们不可能相等。只有到了这一步,才会真正比较两个字符串的内容,这将是一个简单的比较:不会比较所有字符,如果我们发现一个不匹配的字符(在两个字符串中的相同位置),就不会再检查其他字符。
当一切都说了又做了,即使我们有一个字符串是实习生的保证,使用
equals()
方法仍然不是人们可能认为的那种开销,绝对是推荐的方法。如果您想要一个有效的引用检查,那么在语言规范和实现保证相同的枚举值将是同一个对象(通过引用)的地方使用枚举。tf7tbtn214#
==
比较对象引用。.equals()
比较字符串值。有时
==
给出比较字符串值的错觉,如以下情况:这是因为当您创建任何字符串文字时,jvm首先在字符串池中搜索该文字,如果找到匹配项,则会将相同的引用提供给新字符串。因此,我们得到:
(a==b)==>正确
然而,
==
在以下情况下失败:在这种情况下
new String("test")
语句new string将在堆上创建,并且该引用将提供给b
,所以b
将在堆上而不是在字符串池中提供引用。现在
a
正在指向字符串池中的字符串,而b
指向堆上的字符串。因此我们得到:如果(a==b)==>错误。
而
.equals()
总是比较字符串的值,以便在两种情况下都为真:所以使用
.equals()
总是更好。