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
答案 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或任何其他数据结构可以更快地找到并比较两个对象是否相等
答案 2 :(得分:0)
这是因为Strings是一个Java类,其中有一个名为hashCode()的方法,因为它没有args()。
hashCode方法返回字符串对象的哈希码值。
同时,没有提供该输出的所有内容都没有该方法,或者不是对象而是原始数据类型。