Map:HashMap,HashTable,TreeMap简单的底层理解,及为什么set中的对象是不能重复的。

HashMap

HashMap底层实现采用了哈希表,这是一种非常重要的数据结构
哈希表的基本结构就是**“数组+链表”**,结合了数组和链表的优点,即查询,增删都快。
HashMap“数组+链表”的结构示意图
Map:HashMap,HashTable,TreeMap简单的底层理解,及为什么set中的对象是不能重复的。
HashMap存储键值对过程的示意图
Map:HashMap,HashTable,TreeMap简单的底层理解,及为什么set中的对象是不能重复的。
取value对象的过程与存入相同,当根据hash值到达Entry数组对应的索引位置后,会调用equals()方法,与Entry节点中的每一个key对象进行比较,直到找到相同的,并将value返回。

HashMap扩容

HashMap的位桶数组大小可变,初始大小为16,当位桶数组中的元素达到(0.75-数组length),就重新扩容为原来的两倍。
扩容耗时,扩容的本质还是数组的拷贝,将旧数组中的内容拷贝到新数组中。
JDK8中,当链表长度大于8时,链表就转换为红黑树,这样又大大提高了查找的效率。

HashTable

HashTable使用与HashMap相同。
区别
HashTable线程安全,效率低。不允许key或value为null。
HashMap线程不安全,效率高。允许key或value为null。

TreeMap

TreeMap是红黑二叉树的典型实现,存储了数据本身,左节点,右节点,父节点,节点颜色
TreeMap和HashMap对于调用者来说没有区别,HashMap效率高于TreeMap,只有在需要排序的时候才会选用TreeMap(按照key递增的方式排序)

为什么Set中的对象不能重复

set底层用的是一个map存储,因此set中的每一个对象都是map中的key对象,因此是不能重复的。