1.如果两个对象通过equals()方法相等,那么他们的hashCode返回值一定相同;如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。
Object obj1 = new Object();
Object obj2 = obj1;
//判断两个对象是否相等
System.out.println(obj1.equals(obj2));
//获取两个对象的哈希值
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
?以上展示为两个对象通过equals()方法相等,其hashCode值一定相等的情况。
2.两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashCode不相等则可以判定两个对象一定不相等。
String s1 = "Aa";
String s2 = "BB";
System.out.println("s1 hashCode的值为:" +s1.hashCode());
System.out.println("s2 hashCode的值为:" +s2.hashCode());
以上展示为hashCode值相等但对象不相同的情况。?
3.java的容器类被分为Collection和Map两大类,Collection又可以进一步分为List和Set。其中Map和set都不能有重复的,Map不允许有重复的键值,而Map和Set中大多数实现类底层都是散列表结构,比如HashMap、HashSet、HashTable。当我们在不能有重复元素的集合里存放新元素时,首先要判断有没有重复元素,而equals()方法在元素较多时效率很低,因为其时间复杂度为O(n),在有了散列表的配合后,通过计算新元素的哈希值判断该位置是否已经有元素,如果冲突则有元素,此时再使用equals()比较判断对象是否相同。此时哈希计算的时间复杂度为O(1),大大减少了equals比较的次数,极大的提高了数据的存储性能。