如何在 Java 中比较字符串?

为什么直接用==比较字符串会出错?

直接用==比较两个字符串会出错,因为==测试引用相等性(它们是否是同一个对象)。而要用.equals()测试值是否相等(它们是否包含相同的数据)。

Objects.equals()在调用之前会进行null检查,直接调用一个对象的.equals()方法,需要先判断这个对象是否为null。

因此,如果您想测试两个字符串是否具有相同的值,您可能需要使用Objects.equals()

// 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

来自 Java 语言规范JLS 15.21.3。参考相等运算符==!=

虽然==可用于比较 类型的引用String,但这种相等性测试可确定两个操作数是否引用同一个String对象。结果是,false如果操作数是不同的String对象,即使它们包含相同的字符序列(§3.10.5§3.10.6 )。可以通过方法调用 测试两个字符串s和的内容是否相等。ts.equals(t)

您几乎总是使用Objects.equals()。在极少数情况下,当您知道您正在处理内部字符串时,您可以使用==

来自JLS 3.10.5。字符串文字

此外,字符串文字始终引用类的同一实例。这是因为字符串文字(或更一般地说,作为常量表达式 ( §15.28String )值的字符串)被“驻留”,以便使用方法共享唯一实例。String.intern

在JLS 3.10.5-1中也可以找到类似的例子。

其他可考虑的方法

String.equalsIgnoreCase()忽略大小写,判断值相等。但请注意,此方法在各种与语言环境相关的情况下可能会产生意外结果,请参阅此问题

String.contentEquals()将 的内容String与 any 的内容进行比较CharSequence(自 Java 1.5 开始可用)。这样您就不必在进行相等性比较之前将 StringBuffer 等转换为 String,而将空值检查留给您。

0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x