对于面向对象的语言不知道除了 Java 还有没别的语言会拿怎么比较两个字符串相等频频作为面试题来考. 原本是在编程语言中两个字符串内容是否相等时用 ==
比较时却可能是不对的. 在 Java 中
"ab" == "ab" //true
"ab" == "new String("ab") //false
"ab" == String.value("ab") //true
new String("ab").equals(new String("ab")) //true
new String("ab").intern() == new String("ab").intern() //true
在 Java 中明明看到两个字符串内容一样用 ==
进行比较多数时候不是你想要的结果, 只有用 equals()
方法才是王道. 使用 Java 的字符串必须了解它内部是怎么存储的. 比于上面的结果我不作细说, 主要涉及到字符串常量池及内部状态, ==
比较引用, equals()
比较内容.
Java 还常常对 equals
比较字符串津津乐道, 而我仍然认为它是语言设计上的一个缺陷, 所以 JVM 上的其他编程语言如 Groovy, Scala 纷纷倒勾, 无一不是用==
来比较字符串的内容, 它们也提供字符串引用的比较, 但多少人实际关心两个字符串的引用是否相同呢, 反正字符串设计的是 Immutable 的.
若说是因为 Java 不支持操作符的重载, 但可以像 Scala, Groovy 那样在编译器上下功夫的. 最终我想依然是受累于 100% 源代码与二进制的兼容性, 改进的话会造成早先代码的行为错乱. 阅读全文 >>