How to compare two strings are equal in value, what is the best method?
总是对这件事感到困惑。有人能帮忙吗?
方法是string1.equals(string2)。
如果string1等于string2的值,则返回true。否则,它将返回false。
等于引用
- 在开始使用此方法之前,请确保String1不为空。
string1.equals(string2)是正确的方法。
1 2 3 4 5 6 7 8
| String s ="something", t ="maybe something else";
if (s == t ) // Legal, but usually results WRONG.
if (s. equals(t )) // RIGHT way to check the two strings
/* == will fail in following case:*/
String s1 = new String("abc");
String s2 = new String("abc");
if(s1 ==s2 ) //it will return false |
您可以使用==运算符或object.equals(object)方法。
==运算符检查两个主题是否是同一对象,而equals方法检查内容(长度和字符)是否相等。
1 2 3 4 5 6 7
| if(objectA == objectB) {
// objects are the same instance. i.e. compare two memory addresses against each other.
}
if(objectA.equals(objectB)) {
// objects have the same contents. i.e. compare all characters to each other
} |
。
你选择哪一个取决于你的逻辑-使用==如果你能并且等于如果你不关心性能,无论如何它是相当快的。
string.intern()如果您有两个字符串,您可以将它们实习,即让JVM创建一个字符串池,并返回与池实例相等的实例(通过调用string.intern())。这意味着,如果有两个字符串,则可以对两者都调用string.intern(),然后使用==运算符。不过,string.intern()的成本很高,应该只作为一种优化——它只对多次比较有好处。
但是,所有的代码字符串都已被实习,因此如果不创建新的字符串,您可以自由使用==运算符。总的来说,你在
1 2 3
| if(objectA == objectB || objectA.equals(objectB)) {
} |
如果你把这两种情况混为一谈。内联
1 2 3
| if(objectA == null ? objectB == null : objectA.equals(objectB)) {
} |
。
也非常有用,它还处理空值,因为string.equals(..)检查空值。
- +事实上,这救了我。我一直认为可以在数据级别将字符串与==进行比较,因为可以将字符串与编译器时间常量字符串(例如"Hello World!"进行比较,而不会出现问题。我不知道JVM在字符串池中支持这些。问题:objectA == objectB || objectA.equals(objectB)一般比objectA.equals(objectB)快吗?
- 不,一般不快。对于n个比较,如果n==调用的成本比1.equals()便宜,那么它就便宜了。因此,如果n低,字符串长度高,那么它可以更快。
- 注意,您也可以使用哈希表将自己的字符串内部化。
- 啊,它们是通过哈希表在JVM中内部化的,以便保持成本不变?
- 不,但如果您希望像25个字符串(例如7个以前已知的类型)那样进行Internate,以便在某些特定的昂贵操作中使用,则可以使用哈希表将25映射到7个字符串实例,然后在后续操作中继续使用==。我的经验是,它比JVM实习更快(不过,想想看,我很久以前就试过了,事情可能已经改变了)。
您应该使用某种形式的String#equals(Object)方法。但是,您应该如何做到这一点有一些微妙之处:
如果您有一个字符串文字,那么您应该这样使用它:
1
| "Hello".equals(someString); |
这是因为字符串文字"Hello"不能为空,所以您将永远不会碰到NullPointerException。
如果您有一个字符串和另一个对象,那么应该使用:
1
| myString.equals(myObject); |
。
这样做可以确保字符串相等。据你所知,myObject可以是一个类,它总是在其equals方法中返回true!
从不太可能为空的对象开始,因为:
会抛出一个NullPointerException,但这:
。
不会。当参数为空时,String#equals(Object)将正确处理这种情况,因此您只需要担心要取消引用的对象——第一个对象。
==检查它们是否实际上是内存中的同一个对象(有时会令人困惑,因为它们可能都来自池),其中equals()被java.lang.String重写,以检查每个字符以确保真正的相等。因此,你想要的是equals()。
- 我想知道他们为什么把==放在那里?这太令人困惑了!
- well==用于对象相等,这非常有用,特别是在考虑字符串以外的类型时。考虑这样一种情况,您正在比较列表中的元素是否存在重复项。您可以使用嵌套的for循环来编写这个函数,并且不希望比较同一个内存对象,因此您可以使用!=来确保它们不相同,但随后使用equals()来查看它们是否"逻辑上"相同。
- @用户-它在那里,因为它存在于每一个Java引用类型…以及每个Java基元类型…而Java不允许自定义运算符重载。
- 在c中,==等于equals(),所以很难出错。
- @用户可能想查看Java在身份和状态之间的差异。这个问题可能会有所帮助:stackoverflow.com/questions/1692863/…
别忘了
号
如果你不担心那种事…