对Java字符串使用'=='而不是.equals

Ail*_*lyn 9 java equals

可能重复:
什么使参考比较(==)适用于Java中的某些字符串?

我知道之前已经问过,但是尽管建议使用.equals()而不是==比较运算符,我发现它==一直都有效:

String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true
Run Code Online (Sandbox Code Playgroud)

谁能给我一个==操作员失败的例子?

zne*_*eak 40

这是因为你很幸运.==Java中的运算符检查引用相等性:如果指针相同则返回true.它不检查内容是否相等.在编译时找到的相同字符串将折叠为单个String实例,因此它适用于String文字,但不适用于在运行时生成的字符串.

例如,"Foo" == "Foo"可能工作,但"Foo" == new String("Foo")不会,因为new String("Foo")创建一个新String实例,并打破任何可能的指针相等.

更重要的是,您在实际程序中处理的大多数 Strings都是运行时生成的.文本框中的用户输入是运行时生成的.通过套接字接收的消息是运行时生成的.从文件读取的东西是运行时生成的.因此,如果要检查内容是否相等,则使用该equals方法而非==操作符非常重要.

  • 另外一点,"foo"=="foo"实际上有效的原因是因为所有文字字符串都被实习了http://download.oracle.com/javase/1.4.2/docs/api/java/lang /String.html#intern() (3认同)

Pra*_*rav 9

任何人都可以给我一个==运算符失败的例子吗?

例1:

String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2); // false
Run Code Online (Sandbox Code Playgroud)

例2:

Integer a=1000,b=1000;
System.out.println(a == b); // false
Run Code Online (Sandbox Code Playgroud)

  • 小整数(-127 ... 127)也是"实习".因此,对于a = 100,Integer示例实际上将返回true.(这是一个实现细节,但是,我不想依赖它). (3认同)
  • “你好”==“你好”==> 正确。然而, new String("Hello") 将为一个对象分配一些内存,同样的事情也会在其他地方为另一个对象分配更多的内存。由于“==”运算符比较引用,因此将返回 false。 (2认同)

Jav*_*mae 5

执行此操作时,实际上是在创建字符串文字:

String s1 = "Hello";
String s2 = "Hello";
Run Code Online (Sandbox Code Playgroud)

编译器找到相同的字符串文字,然后通过在堆中保留一个实例并使堆栈中的所有变量指向它来进行优化.所以做一个==将返回true,因为它们指向相同的内存地址.

执行此操作时,您将创建字符串对象:

String s1 = new String("Hello");
String s2 = new String("Hello");
Run Code Online (Sandbox Code Playgroud)

实例化将为堆中的每一个创建唯一的空间,堆栈变量将指向那些单独的位置.因此,这些将是相同的,.equals()因为它们的值是相同的,但它们将不相等使用,==因为它们是堆内存空间中的不同对象.