1、==
1.判断两个数值类型是否相等
int a = 5;
int b =5;
if(a==b)
2.判断对象是否相等
User user1 = new User();
User user2 = new User();
// 比较的是两个对象的内存地址
if(user1 == user2)
2、Equals
//如果是字符串:
String str1 ="aaa";
String str2 ="aaa";
//判断两个字符串是否相等
str1.equals(str2)
// 如果要比较两个对象,其实对比的就是内存地址
user1.equals(user2)
Object 类中的方法:
public boolean equals(Object obj) {
return (this == obj);
}
- 如果两个对象相同,那么hashCode 一定是相同的
3、hashCode
- 默认返回的是内存地址,但该方法的本意是散列。散列的话就必然涉及到在一定的空间中进行散列,所以hashcode方法一定是和集合配合使用的时候才用得到
- 对象在空间散列化存储之后,其优势在于检索,如果散列算法处理得好,也就是能够保证对象在空间中尽可能均匀分布,则在检索时,一旦确定桶的方位(即下标值),就可以排除(n-1)/n的数据量,所有在大型数据集合中,hash之后的对象检索性能是非常高的。
父类Object 类中的公共方法:
/**
Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by java.util.HashMap.
*/
public int hashCode() {
return identityHashCode(this);
}
- java中的HashMap集合的内部实现是数组+链表实现,即Node[]数组方式实现的。而Node的源代码如下:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
}
-
可以看出,Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用 next,这就构成了链表。
HashMap 结构图 - 简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
