在 Java 中使用“==”理解两个字符串之间的不同类型的相等性

问题描述

在 Java 中使用“==”运算符比较两个字符串时,我们知道我们正在比较对象在内存中的地址。但是我们也知道在 Java 中确实存在字符串池,因此字符串文字产生的值将被池化。 在如下情况下,布尔值 check1、check2 和 check3 在我看来都是一样的:

String a = "a";
String b = "b";
String ab = "ab";

boolean check1 = (a + b == "ab");
boolean check2 = (a + b == ab);

System.out.println( check1 );  // false NO POOL
System.out.println( check2 );  // false NO POOL

String s1 = "hello" + " web";
String s2 = "hello web";

boolean check3 = ( s1 == s2 ); 

System.out.println( check3 ); // true POOL

然而,check1 和 check2 为假,check3 为真。

我发现的原因是,在上次检查中,Java先将两个值连接起来,然后再检查字符串池,然后意识到该值已经存在池中并分配引用。

而 check1 和 check2 为假,因为 a + b 在内存中创建了一个新对象。

但为什么 Java 对这两种操作的处理方式不同?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)