为什么在比较字符串,java 1.6.0_29,osx时可以使用"=="?

Ari*_*wan 4 java

昨天(2012年4月5日)我正在尝试比较环境中的字符串:

电脑1

  1. Java(TM)SE运行时环境(版本1.6.0_29-b11-402-11D50b)
  2. OS X 10.7.3

电脑2

  1. Java(TM)SE运行时环境(版本1.6.0_29-b11-402-11D50b)
  2. 窗口7

电脑3

  1. Java(TM)SE运行时环境(版本1.6.0_29-b11-402-11D50b)
  2. Linux Ubuntu 11.10

这是我尝试的代码

public class TComp{
    public static void main(String[] args){
        String a = "arif";
        String b = "arif";
        if(a==b){
            System.out.println("match!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,要比较java中的字符串,我们应该使用.equal()函数,'=='将在这种情况下进行实习.但是对于那些所有具有不同操作系统的计算机,为什么实习生在计算机1中工作正常,而我在计算机2和计算机3中出错?

如果我错了任何一种词,请更正.谢谢.

Edw*_*uck 5

在同一个类中,.class编译器将所有字符串常量都折叠到文件常量池中(在编译时).这意味着编译器只会存储一个字符串副本(因为谁需要池中有两个相同的常量?).

这意味着在一个类中,==字符串的比较通常有效; 然而,在你太兴奋之前,有一个很好的理由你永远不应该使用==字符串的比较. 无法保证您比较的两个字符串都来自同类常量池.

所以,

"foo" == new String("foo")
Run Code Online (Sandbox Code Playgroud)

完全可能会失败,而

"foo" == "foo"
Run Code Online (Sandbox Code Playgroud)

可能有用.这力量很大程度上取决于执行的,如果你的代码来执行,而不是规范,你会发现自己在如果实现变化,因为规范实际上并不需要一个很讨厌的惊喜在于执行.

简而言之,每次都.equals(...)用于Object比较.保留==原始比较和"这是相同的对象实例"比较.即使您认为这两个Strings可能是实例(或同一个对象),因为您永远不知道何时将在不同的类加载器下运行,在不同的JVM实现上运行,或者在一台仅仅决定不实习的情况下运行.