WeakHashMapLinkedHashMap TreeMap Set(H

文章目录Set
Java中的四种引用
在JVM中,一个对象如果不再被使用就会被当做垃圾给回收掉,判断一个对象是否是垃圾,通常有两种方法:引用计数法和可达性分析法 。不管是哪一种方法判断一个对象是否是垃圾的条件总是一个对象的引用是都没有了 。
【WeakHashMapLinkedHashMap TreeMap Set(H】JDK1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用、软引用、弱引用、虚引用4 种 。而我们的就是基于弱引用 。
引用简介
强引用
如果一个对象具有强引用,它就不会被垃圾回收器回收 。即使当前内存空间不足,JVM也不会回收它,而是抛出错误,使程序异常终止 。比如 str = new ("hello");这时候str就是一个强引用 。
软引用
内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常 。
弱引用
如果一个对象具有弱引用,在垃圾回收时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收 。
虚引用
如果一个对象具有虚引用,就相当于没有引用,在任何时候都有可能被回收 。使用虚引用的目的就是为了得知对象被GC的时机,所以可以利用虚引用来进行销毁前的一些操作,比如说资源释放等 。
简介
它虽然增加了时间和空间上的开销,但是通过维护一个运行于所有条目的双向链表,保证了元素迭代的顺序 。该迭代顺序可以是插入顺序或者是访问顺序 。
存储结构
/*** The head (eldest) of the doubly linked list.*/transient LinkedHashMap.Entry head;/*** The tail (youngest) of the doubly linked list.*/transient LinkedHashMap.Entry tail;/*** The iteration ordering method for this linked hash map: true* for access-order, false for insertion-order.** @serial*/final boolean accessOrder;/*** HashMap.Node subclass for normal LinkedHashMap entries.*/static class Entry extends HashMap.Node {Entry before, after;Entry(int hash, K key, V value, Node next) {super(hash, key, value, next);}}
的结点结构在继承于的基础上,增加了和after属性来确保插入顺序 。并且还维护了头结点head和尾结点tail 。在插入数据时,不但需要通过哈希算法进行存储,还需要通过和after模拟双向链表存储结构,进行插入顺序的维护 。
所继承于结点中的next属性是用于维护中table数组中存储的链表 。而其独有的和after是模拟双向链表进行结点插入顺序的维护
简介
在前面我们通过中插入顺序无序引出了的使用,但是我们又可以发现,这两种存储方式在迭代时均不是按照数据的大小顺序进行遍历的,而当我们需要将数据按照大小顺序迭代时,就需要此时的集合了 。
的存储结构
// Red-black mechanicsprivate static final boolean RED= false;private static final boolean BLACK = true;/*** Node in the Tree.Doubles as a means to pass key-value pairs back to* user (see Map.Entry).*/static final class Entry implements Map.Entry {//key,val是存储的原始数据K key;V value;//定义了结点的左孩子Entry left = null;//定义了结点的右孩子Entry right = null;//通过该节点可以反过来往上找到自己的父亲Entry parent;//默认情况下为黑色节点,可调整boolean color = BLACK;/*** Make a new cell with given key, value, and parent, and with* {@code null} child links, and BLACK color.*/Entry(K key, V value, Entry parent) {this.key = key;this.value = http://www.kingceram.com/post/value;this.parent = parent;}}