Java集合框架读书笔记(五)

PriorityQueue
Java中的PriotiryQueue通过二叉小顶堆实现。Java的优先队列保证每次取出的元素都是队列中权值最小的。大小可以通过自然顺序和传入构造器比较。
在这里插入图片描述
二叉堆完全可以用数组来表示。

add和offer
两个方法语意相同,都是向优先队列中插入元素,只是前者失败会抛出异常,后者则会返回false。
新加入的元素可能会破坏最小堆的性质,因此需要调整。

element和peek
两个函数语意完全相同,都是获取但不删除队首元素。前者抛出异常,后者返回null。直接返回数组0下标那个元素即可。
在这里插入图片描述

remove和poll
这两个函数的方法和语意完全相同,前者失败抛出异常,后者返回null,删除后后需要改变队列的结构来维护最小堆的性质,需要进行调整。
在这里插入图片描述

remove(Object o)
这个方法用于删除队列中根o相等的一个元素,该接口不是Queue接口内的方法,而是collection接口的方法。
整体分为两种情况,1.删除最后一个元素,直接删除即可。2.删除的不是最后一个元素,从删除点开始以最后一个元素为参照调用一次sifDown即可。
在这里插入图片描述

WeakHashMap
从名字就可以看出它是某种Map,它的特殊之处就在于WeakHashMap里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法。

更直观的说,当使用WeakHashMap时,即使没有显示的添加或者删除任何元素,也可能发生如下情况:
调用两次size()方法返回不同的值。
调用两次 isEmpty()第一次返回false,第二次返回true。
两次调用containsKey(),第一返回false,第二次返回true。
两次调用get()方法,第一次返回一个value,第二次返回null。

那么WeakHashMap有什么用那?
WeakHashMap适用于需要缓存的场景。在缓存场景下,由于内存是有限的,不能缓存所有对象。

工作原理是弱引用,GC判断某个对象是否可被回收的依据是,是否有有效的引用指向该对象。如果没有,那么该对象就是可回收的。仅有弱引用的对象也会被GC回收。

由于没有WeakHashSet,所以可以通过函数将WeakHashMap包装成set。

猜你喜欢

转载自blog.csdn.net/bianhao92115/article/details/86539340