Java散列表,树对应的容器类,hashmap如何解决冲突

散列表:
Hashmap、hashtable、concurrentHashMap、hashset
树:
treemap、treeset
CopyonWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。

treeset继承自treemap, hashset继承自hashmap

Entry:key和value的组合。

对于treemap而言,由于它底层采用一颗“红黑树”来保存集合中的Entry,这意味着TreeMap添加元素、取出元素的性能都比HashMap低。
当TreeMap添加元素时,需要通过循环找到新增Entry的插入位置,因此比较耗性能;
当treemap中取出元素时,需要通过遍历才能找到合适的Entry,也比较耗性能。
但treemap、treeset比hashmap、hashset的优势在于:
TreeMap中的所有Entry总是按key根据指定顺序规则保持有序状态,treeset中所有元素总是根据指定排序规则保持有序状态

HashMap中调用hashCode()方法来计算hashCode。因为在Java中两个不同的对象可能有一样的hashCode,所以不同的键可能有一样hashCode,所以会导致冲突的产生。

bucket:这个数组里可以存储元素的位置被称为“桶(bucket)”,每个 bucket 都有其指定索引,系统可以根据其索引快速访问该 bucket 里存储的元素。

Hashmap里面的bucket出现了单链表的形式,散列表要解决的一个问题就是散列值的冲突问题,通常是两种方法:链表法和开放定址法。链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。

二种:

开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。

链地址法:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0…m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。

转载:https://my.oschina.net/134596/blog/668416

发布了53 篇原创文章 · 获赞 5 · 访问量 427

猜你喜欢

转载自blog.csdn.net/qq_45287265/article/details/105013831