我正在检查java如何为Strings
创建引用我写了下面的代码
String s = new String("Tushar");
String s1 = new String("Tushar");
System.out.println("String HashCode");
System.out.println(s.hashCode());
System.out.println(s1.hashCode());
StringBuffer stringBuffer = new StringBuffer("Tushar");
StringBuffer stringBuffer1 = new StringBuffer("Tushar");
System.out.println("StringBuffer HashCode");
System.out.println(stringBuffer.hashCode());
System.out.println(stringBuffer1.hashCode());
StringBuilder stringBuilder = new StringBuilder("Tushar");
StringBuilder stringBuilder1 = new StringBuilder("Tushar");
System.out.println("StringBuilder HashCode");
System.out.println(stringBuilder.hashCode());
System.out.println(stringBuilder1.hashCode());
输出如下
String HashCode
-1778537625
-1778537625
StringBuffer HashCode
715152323
99120402
StringBuilder HashCode
1616769989
942619632
为什么StringBuilders和StringBuffers的哈希码不匹配。
这些只是分配它们的内存位置还是根据传递的字符串创建哈希码?
编辑:
理解:无论创建方式如何,值的哈希码都保持不变。
困惑:打印的值是什么(实例变量的哈希值是什么意思?)。
答案 0 :(得分:2)
每个班级都可以选择以自己的方式计算哈希码。哈希码没有意义,也有非常简单的规则(缩写):
equals()
返回true 的对象必须返回相同的哈希码。equals()
返回false 的对象应返回不同的哈希代码,以达到类的最佳能力,以确保更好地执行哈希表,例如HashMap
和{{ 1}}。由于HashSet
的值String
和"ABC"
的值StringBuilder
不是相等,因此不要求他们返回相同的哈希码。
如果从"ABC"
中提取String
值,则 字符串值必须与具有相同值的另一个字符串具有相同的哈希码,并且它将如此以下两个表达式将返回相同的值:
StringBuilder
作为旁注:new String("ABC").hashCode()
new StringBuilder("AB").append("C").toString().hashCode()
和StringBuilder
都不会实现StringBuffer
和equals()
,因此它们的相等性基于身份,而非值。具有相同值的两个hashCode()
对象仍然不会#34;等于",因此(很可能)不具有相同的哈希码。
答案 1 :(得分:1)
行stringBuilder.hashCode()
和stringBuffer.hashCode()
可以获得stringBuilder和stringBuffer实例的哈希值,从而产生差异。
由于String是不可变的(请参阅我的编辑),获取stringBuilder
和stringBuffer
字符串的哈希值将是相同的。
所以:
System.out.println(stringBuffer.toString().hashCode());
System.out.println(stringBuffer1.toString().hashCode());
System.out.println(stringBuilder.toString().hashCode());
System.out.println(stringBuilder1.toString().hashCode());
所有将返回相同的哈希
编辑: 另请注意,字符串散列的计算是:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
所以,即使只有一个字符串副本" abc"在内存中,相同字符串的哈希值在每次运行时返回相同的值。