我是Java编程的新手,我想创建多个字符串,为此我写了下面的代码。为什么它会为两个字符串对象生成相同的哈希代码?
class SingletonClass {
public static String mystring="this";
}
public class SingletonObjectDemo {
public static void main(String args[]) {
String str = SingletonClass.mystring;
String str2 = SingletonClass.mystring;
System.out.println("String str "+str.hashCode());
System.out.println("String str1 "+str2.hashCode());
}
}
5条答案
按热度按时间icomxhvb1#
它为两个字符串对象生成相同的哈希代码...因为它们是同一个对象。
htrmnn0y2#
它们在记忆中引用同一个对象,在本质上没有区别。
flvtvl503#
当你写
String str = "a", str2 = "a";
的时候,你不是在创建两个字符串,而是声明了两个变量,它们包含了对字符串常量“a”的完全相同的引用。即使它们是两个对象,如
String str = new String("a"), str2 = new String("a")
中的hashCode
仍然是相同的,因为对于相同的对象,它们的哈希码必须匹配--这是哈希码的基本属性。但是,如果你写
Object o = new Object(), o2 = new Object()
,现在哈希码会不同,因为没有两个Object
的示例是相等的(根据Object
类的相等性定义)。rqcrx0a64#
你说你"想要创建多个字符串",但是你使用的是一个名为SingletonObjectDemo的东西。单例的意义在于,无论你"创建"多少次,都只有一个对象,所以你不能创建多个对象。正如Louis所解释的,这就是为什么哈希代码返回相同的结果。
5w9g7ksd5#
这是一个好的散列码的属性。
如果A和B是对象,使得A.等于(B),那么下面的性质应该成立。
A.hashCode().相等(B.hashCode())
您可以阅读有关hashCode和equals()here的内容