前言
HashCode是在Java中用于获取对象的唯一标识符的方法。它是根据对象的内容生成的一个整数值。对象的hashCode()方法被调用时,它返回的是对象的哈希码。哈希码可以用于在哈希表等数据结构中快速定位对象。
在Java中,hashCode()方法是被Object类定义的,所有的对象都可以调用该方法。默认情况下,hashCode()方法返回的是对象的内存地址的哈希码表示。
通常情况下,如果两个对象的equals()方法返回true,那么它们的hashCode()方法应该返回相同的值。这是为了确保在集合类(如HashMap、HashSet等)中能正确地工作。
如果你自定义的类需要使用equals()方法进行对象的比较,那么通常也需要重写hashCode()方法,保证它们的一致性。
你可以使用hashCode()方法来获取对象的哈希码,例如:
public class MyClass {private int id;private String name;// constructors, getters, setters, etc.@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + id;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}
}
在上面的例子中,hashCode()方法根据对象的id和name属性生成哈希码。这样,当两个对象的id和name属性相同时,它们的hashCode()方法会返回相同的值。
hash是随机生成的吗
哈希码的生成通常是根据对象的内容计算得出的,而不是随机生成的。在Java中,默认的hashCode()方法实现是根据对象的内存地址计算得到的一个整数值。这意味着,对于同一个对象,在其生命周期内,多次调用hashCode()方法应该返回相同的值。
然而,有时候我们会根据对象的内容来自定义hashCode()方法。在这种情况下,哈希码的生成过程可以依赖于对象的属性,并且根据具体的实现方式而有所差异。
重要的一点是,生成的哈希码应该尽可能地保持唯一性和均匀分布,以提高在哈希表等数据结构中的查找效率。这样可以尽量避免哈希冲突(即不同对象生成了相同的哈希码),从而提高性能。
需要注意的是,尽管哈希码是根据对象的内容计算得出的,但它并不保证对象的唯一性。不同的对象可能会生成相同的哈希码,这就是所谓的哈希冲突。为了解决哈希冲突,Java中提供了equals()方法进行对象的比较,当equals()方法返回true时,可以认为两个对象是相等的。
因此,在使用哈希码时,我们既需要考虑哈希码的计算方式,也需要正确实现equals()方法来确保对象的相等性判断。
hash碰撞
Set set = new HashSet();int hashCodeValue;for (int i = 1; i <= 150000; i++){hashCodeValue = new Object().hashCode();if(set.contains(hashCodeValue)){//你新生成的刚好是我hashset里面已经有的,冲突发生....System.out.println("发生hash冲突,在第: "+i+" 次,hashCodeValue "+ hashCodeValue);continue;}else{set.add(hashCodeValue);}}System.out.println(set.size());
这段代码创建了一个HashSet并循环生成150,000个对象的哈希码,并将哈希码添加到HashSet中。如果生成的哈希码已经存在于HashSet中,则打印出哈希冲突的信息,继续下一个循环。最后打印HashSet的大小。java中在100000次内一般不会发生hash冲突(碰撞),在110000次中一般会发生一次hash冲突。上面代码中生成了150000次hashcode值,发生了五次冲突。java的安全性还是很厉害的
(44-李四)覆盖(44-张三)
形成链表
依次比较