hashMap和hashSet

一、hashMap结构

HashMap底层维护的是一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中;
当向HashMap中put一对键值对时,它会根据key的hashCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。如果该位置没有对象存在,就将此对象直接放进数组当中;
如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找。
如果此链中有对象,就会使用equals()方法进行比较,如果比较之后为false(说明不是同一个对象),则将该对象放到数组中,然后将数组中该位置以前存在的对象链接到此对象的后面。

hashMap底层结构是数组+链表+红黑树
当hash值相同时就会以链表形式向后拼接,当链表数量长度达到8时自动变为红黑树,remove小于8后自动转为链表。

二、hashSet

HashSet底层是通过HashMap实现的,看如下的构造函数,构造HashSet的时候底层就构造了一个HashMap

public HashSet() {
        map = new HashMap<>();
}
private static final Object PRESENT = new Object();
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
}

hashSet添加的过程:
当hashSet添加对象时,会先调用hashCode方法比较hash值,然后根据hash值决定把对象放在对应位置。
根据hashCode方法比较hash值可能会出现两种情况:
1.hashCode不同,直接讲对象放进对应位置
2.hashCode相同。这时就不能判断对象是否相同,需要调用equals方法进行比较

  1. 如果equals方法为true则表示两个对象相同,属于重复添加,不进行添加。
  2. 如果equals方法为false,则表示两个对象并不是同一个对象。就会添加在hashcode对应的数组上并引出链,连接原来位置的对象,jdk8之后,当链表值达到8之后会自动转化为红黑树

你可能感兴趣的:(java汇总,数据结构,链表,散列表,哈希算法)