==运算符对String有什么用?

Evd*_*afa 6 java string

在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,对于你放入它的每个对象,它们的行为方式都是一样的.

说了这么多,避免操作员超载(尽可能)的决定是一个相当随意的设计选择.