在Java中,如果要检查两个字符串是否相等,在它们的值相同的意义上,他/她需要使用该equals方法.例如:
String foo = "foo";
String bar = "bar";
if(foo.equals(bar)) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
如果想要检查参考相等性,他需要在两个字符串上使用==运算符.
if( foo == bar ) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
所以我的问题是==运算符是否用于String类?为什么要比较字符串引用?
编辑:
我不问:如何比较字符串?==如何工作?该equals方法如何工作?
我要问的是==运算符对Java中的String类有什么用处?不重载它的理由是什么,以便进行深入的比较?
Old*_*eon 15
想象一下,线程安全Queue<String>充当生产者线程和消费者线程之间的通信通道.使用特殊String表示终止似乎是完全合理的.
// Deliberate use of `new` to make sure JVM does not re-use a cached "EOT".
private static final String EOT = new String("EOT");
...
// Signal we're done.
queue.put(EOT);
// Meanwhile at the consumer end of the queue.
String got = queue.get();
if ( got == EOT ) {
// Tidy shutdown
}
Run Code Online (Sandbox Code Playgroud)
请注意,这将适应:
queue.put("EOT");
Run Code Online (Sandbox Code Playgroud)
因为"EOT" != EOT即使"EOT".equals(EOT)会true.
biz*_*lop 10
有什么用呢?在正常练习中并不多,但您总是可以编写一个对intern()-ed字符串进行操作的类,然后可以使用它==来比较它们.
为什么它不被重载是一个更简单的问题:因为Java中没有运算符重载.(为了搞砸了一些东西,+运算符对于字符串来说有点过载,这样做是为了使字符串操作稍微麻烦一点.但是你可以说这只是语法糖而且在字节码级别上肯定没有Java中的运算符重载. )
缺少重载==运算符使得运算符的使用更加模糊,至少对于引用类型而言.(也就是说,直到引入自动装箱/拆箱点,这再次混淆了水域,但这是另一个故事.)它还允许你拥有这样的类IdentityHashMap,对于你放入它的每个对象,它们的行为方式都是一样的.
说了这么多,避免操作员超载(尽可能)的决定是一个相当随意的设计选择.
| 归档时间: |
|
| 查看次数: |
1312 次 |
| 最近记录: |