我知道之前已经问过,但是尽管建议使用.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方法而非==操作符非常重要.
任何人都可以给我一个==运算符失败的例子吗?
例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)
执行此操作时,实际上是在创建字符串文字:
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()因为它们的值是相同的,但它们将不相等使用,==因为它们是堆内存空间中的不同对象.
| 归档时间: |
|
| 查看次数: |
9821 次 |
| 最近记录: |