java - java中的字符串相等检查
问题描述
以下两种说法的区别:
String s = "Hello";
String s = new String("Hello');
在第一个语句中,赋值运算符 - 用于将字符串文字分配给 String 变量s
。在这种情况下; JVM
首先检查字符串常量池中是否已经存在同一个对象。如果它可用,那么它会创建另一个对它的引用。如果相同的对象不可用,则它会创建另一个内容为“Hello”的对象并将其存储到字符串常量池中。
在第二个语句中,new
运算符用于创建字符串对象。在这种情况下,JVM
总是在不查看字符串常量池的情况下创建一个新对象。
我对下面提供的代码的怀疑是语句的输出
System.out.println(a.hashCode() + " " + b.hashCode());
根据规则,这里两个对象都应该有不同的内存位置,但是显示了它们的哈希码true
import java.util.HashMap;
import java.util.Map;
class TestStringEquality
{
public static void main (String[] args)
{
String a = new String("abcd");
String b = new String("abcd");
System.out.println(a == b);
System.out.println(a.hashCode() + " " + b.hashCode());
System.out.println(a.equals(b));
Map<String, String> map = new HashMap<>();
map.put(new String("abcd"), "abcd");
map.put(new String("abcd"), "wxyz");
System.out.println(map);
}
}
我得到的输出如下:
false
2987074 2987074
true
{abcd=wxyz}
解决方案
根据https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#hashCode上的 API 表 ——字符串哈希码中使用的公式取决于长度和内容的字符串,而不是内存位置。因此,具有不同内存位置的两个相同字符串应该给出相同的哈希码。
推荐阅读
- flutter - 如何在颤动中导航到另一个类的方法
- python - 如何检查所有元素是否属于一组?
- pytorch - TorchScript 模型导出中的重复分支
- javascript - 如何获取我在柏树字段下插入的文本长度
- python - 不允许使用饼干机械汤
- plot - 在 Maple 中线性化,绘制微分方程系统的分岔?
- mysql - sql根据父表求和
- python - 如何从 rsa 加密消息中获取数字
- javascript - 如何使用 js 以编程方式在另一个页面上读取 chrome://discards 的内容?
- react-native - NativeModule:AsyncStorage 与 Expo 为空