集合
Java的集合类的实现是将具体实现和接口分离的方法,策略模式?
Iterator
Java的迭代器只能向后运动,不想C++知道了一个迭代器,可以通过i++和i--向前向后移动。
java的迭代器模型,当调用next()方法时,next返回越过的对象。
调用remove方法之前要先调用next方法。就是说,如果我们要删除一个队列的第一个元素,那么我们先调用下next让它跳到1和2之间,如果不这样做,当我们再次调用next的时候,就不知跳到哪了,因为元素从集合中删除了。
Collections
List
ArrayList
可以可扩容缩容的非线程安全的数组。
LikedList
双向链表,不提供随机访问,但是插入删除节点的效率比ArrayList更好,也不需要扩容。
Set
HashSet
用hash的方式组织集合,不提供元素的有序形式。插入和检索的速度比TreeSet更快。
TreeSet
用平衡搜索树的方式组织集合,提供元素的有序形式,插入和检索的速度慢一下。
Queue
队列的数据结构,提供先进先出的形式。
Deques
双端队列,既可以从头插入也可以从尾巴插入,既可以从尾巴离开,也可以从头部离开。
Priority Queues
优先队列,根据元素的优先级对元素进行排序,优先级越高的元素越靠近队头。有序堆的实现。
Maps
Map是提供一种键到值映射的数据结构,和数组类似,但是没有数组的限制,Map类型的键值可以是任意的,但是必须是唯一的。每个键只能映射到唯一的值上。HashMap和TreeMap的不同点就是键值的组织方式。
HashMap
HashMap是将键值hash到它对应的位置上,提供更高效的检索和插入,但是键值是无序的状态。HashMap的具体数据结构是数组+链表+红黑树。
从数据结构中可以看出HashMap解决hash冲突的方式是拉链法,当一个发生冲突的区域中的节点越来越多时,就是链表过长,会导致查找速度变慢,当链表的长度超过8个时,链表就转换为了红黑树。这是因为红黑树查找速度2logn链表的查找速度时n。当链表长度超过8时n的值就大于2logn了。
TreeMap
TreeMap是用平衡搜索树的方式存储键值,可以提供键值集的有序形式。但是检索和插入的效率自然也不如HashMap。
WeakHashMap
WeakHashMap是解决当键从map中删除时,键所引用的value不会被删除(垃圾回收器跟踪的是活动对象,只要map是活动的,那么map中的东西就不可以被删除),必须让程序来解决这个问题,就是说在删除键之前,我们要先删除值。
但是通过WeakHashMap可以实现map删除键时,可以让垃圾回收器回收没有引用的value。具体就是插入一个键值,WeakHashMap为这个键创建两个引用,一个是WeakReference对象,一个就是hash值。当一个value只有一个WeakReference对象引用时,就可以将这个回收,并且将这个WeakReference对象引用加入WeakReference队列中,WeakhashMap定期检查这个队列删除对应的条目。
Linked HashSet 和 HashMap
可以通过 LinkedHashSet和LinkedHashMap类可以记忆插入的顺序。
var staff = new LinkedHashMap<String, Employee>();
也可以记忆对访问的顺序,越经常访问的放在越后面,越常访问的放在越前面。
LinkedHashMap<K, V>(initialCapacity, loadFactor, true)
当这个LinkedHashMap满的时候,我们通过Iterator对象删除一点在链表前的实例来释放空间。也可以通过自动化的方式实现这个共功能。
var cache = new LinkedHashMap<K, V>(128, 0.75F, true){
protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
{
return size() > 100;
}
};