HashSet/TreeSet

HashSet内部有一个HashMap,只使用了map的key,value都是同一个object
private static final Object PRESENT = new Object();
TreeSet内部是一个TreeMap,只使用了key,value也是上面这个object。

LinkedHashMap

LinkedHashMap是HashMap的子类,与HashMap有着同样的存储结构,但它加入了一个双向链表的头结点(有head和tail指针),将所有put到LinkedHashmap的节点一一串成了一个双向循环链表,因此它保留了节点插入的顺序,可以使节点的输出顺序与输入顺序相同。LinkedHashMap同样是非线程安全的,只在单线程环境下使用。
1) Entry元素:
LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。
2) 初始化:
通过源代码可以看出,在LinkedHashMap的构造方法中,实际调用了父类HashMap的相关构造方法来构造一个底层存放的table数组。
3) 存储:
LinkedHashMap**并未重写父类HashMap的put方法**,而是重写了父类HashMap的put方法调用的子方法void addEntry() 和void createEntry(i),提供了自己特有的双向链接列表的实现。
4) 读取:
LinkedHashMap**重写了父类HashMap的get方法**,实际在调用父类getEntry()方法取得查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的元素添加到双向链表的表头,并从原来的位置删除。由于的链表的增加、删除操作是常量级的,故并不会带来性能的损失。
5) 排序模式:
LinkedHashMap定义了排序模式accessOrder,该属性为boolean型变量,对于访问顺序,为true;对于插入顺序,则为false。
一般情况下,不必指定排序模式,其迭代顺序即为默认为插入顺序。这些构造方法都会默认指定排序模式为插入顺序。如果你想构造一个LinkedHashMap,并打算按从近期访问最少到近期访问最多的顺序(即访问顺序)来保存元素,可以实现LRU(最近最少使用页面置换算法)

猜你喜欢

转载自blog.csdn.net/jcsyl_mshot/article/details/80081615