为什么字符串类根据给定的字符串值创建哈希码?

时间:2015-04-13 15:53:39

标签: java string hashcode

Hashcodes是每个对象的唯一值,但为什么只有String类才会像这样创建哈希码。

public class StringSample 
{
public static void main(String[] args) 
{

String s1=new String("Example");
String s2=new String("Example");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());

}
}

结果

341682506
341682506

但是这个程序给出了不同的哈希码值

class Sample 
{
Sample(String str)
{

}
}
public class Mainclass
{
public static void main(String[] args) 
{
Sample s1=new Sample("Example");    
Sample s2=new Sample("Example");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}

}

结果:

2018699554
1311053135

3 个答案:

答案 0 :(得分:3)

您的假设不正确,参见http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--

  

如果两个对象根据不相等而不是必需的   equals(java.lang.Object)方法,然后调用hashCode方法   两个对象中的每一个都必须产生不同的整数结果。

但是,如果根据equals(java.lang.Object)方法两个对象相等,则必须具有相同的哈希码:

  

如果两个对象根据equals(Object)方法相等,那么   必须在两个对象中的每一个上调用hashCode方法   相同的整数结果。

在您的示例中,根据s1方法,s2 等于equals(java.lang.Object),因此哈希码在不违反其一般合同的情况下不能有所不同:

  public static void main(String[] args) {
    String s1=new String("Example");
    String s2=new String("Example");

    System.out.println(s1.equals(s2)); // true
  }

更新

关于您的更新,并可能澄清我的初步答案。与String不同,您的Sample课程可能不会覆盖hashCode()equals(java.lang.Object)。这意味着将使用Java的默认实现,它与当前实例的内存位置一起工作(我不知道确切的细节,但这确实应该为不同的对象产生不同的哈希码)。但是,这也意味着对于您示例中的s1.equals(s2)个对象,false将为Sample

现在为什么String会覆盖equals(java.lang.Object)?因为人们会期望具有相同值的两个字符串(即"示例")应该被代码视为相等。要遵守equals(java.lang.Object)hashCode()之间的一般合​​同(参见上面的javadoc),String现在必须覆盖hashCode()方法以生成相同的哈希码相同的价值观。

简化:如果String不会覆盖hashCode()以产生观察到的输出,则两个不同的字符串不能相等。

免责声明:请注意,Java中的字符串通常是实习的,其行为略微不同于常规"对象,但这只是为了完整和进一步阅读。您可能还想了解equals==之间的差异。

答案 1 :(得分:0)

hashCode()背后的想法是,如果两个对象相等,它们应该共享相同的hashCode。这样,HashMap或任何其他数据结构可以更快地找到并比较两个对象是否相等

http://en.wikipedia.org/wiki/Java_hashCode%28%29

答案 2 :(得分:0)

这是因为Strings是一个Java类,其中有一个名为hashCode()的方法,因为它没有args()。

hashCode方法返回字符串对象的哈希码值。

同时,没有提供该输出的所有内容都没有该方法,或者不是对象而是原始数据类型。