String,StringBuilder和StringBuffer创建的String之间的区别

时间:2017-02-03 18:17:30

标签: java string

我正在检查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的哈希码不匹配。

这些只是分配它们的内存位置还是根据传递的字符串创建哈希码?

编辑:

理解:无论创建方式如何,值的哈希码都保持不变。

困惑:打印的值是什么(实例变量的哈希值是什么意思?)。

2 个答案:

答案 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都不会实现StringBufferequals(),因此它们的相等性基于身份,而非值。具有相同值的两个hashCode()对象仍然不会#34;等于",因此(很可能)不具有相同的哈希码。

答案 1 :(得分:1)

stringBuilder.hashCode()stringBuffer.hashCode()可以获得stringBuilder和stringBuffer实例的哈希值,从而产生差异。

由于String是不可变的(请参阅我的编辑),获取stringBuilderstringBuffer字符串的哈希值将是相同的。

所以:

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"在内存中,相同字符串的哈希值在每次运行时返回相同的值。