七、队列
排队,先进先出。
除并发应用外Queue只有两个实现:LinkedList,PriorityQueue。他们的差异在于排序而非性能。
一些常用方法:
继承自Collection的方法:
add 在尾部增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
自带的方法:这些更适用于缓冲和并发访问,最主要是不报异常啊
offer 在尾部添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
八、理解Map
标准的Java类库包含以几种基本实现:
HashMap,TreeMap,LinkedHashMap,WeakHashMap,ConcurrentHashMap,IdentityHahMap.
1.性能
普通的Map中get()方法呈线性搜索,执行速度相当慢,而hashMap使用了特殊的:散列码来取代对键缓慢的搜索。
散列码:“相对唯一”的,用以代表对象的int值。hashCode()是根类Object中的方法,所以所有Java对象都有散列码,HashMap就是使用对象的hashCode()进行快速查询的。
HashMap *:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子以调节容器的性能。最常用的Map。
LinkedHashMap:使用链表维护内部顺序,所以迭代访问快。get访问要慢一点点。
TreeMap:基于红黑树实现的。键会由Comparable或Comparator进行排序,是唯一带有subMap()方法的Map;
WeakHashMap:弱键(weak key)映射,允许释放映射所指向的对象;如果映射之外没有引用指向某个"键",则此”键“可以被垃圾回收
ConcurrentHashMap:一种线程安全的Map.详见 Java编程思想——第21章 并发 读书笔记系列
IdentityHashMap:使用== 代替 equals()对键进行比较的散列映射。
对Map的键要求于Set中的元素要求一样,任何键都要由一个equals()方法;如果是散列Map,键要实现hashCode()方法;如果是TreeMap,必须实现Comparable。
2.SortedMap
TreeMap是现在的唯一实现,确保键处于排序状态,以下是由SortedMap提供的方法:
//返回当前Map使用的Comparator public Comparator<? super K> comparator() { return comparator; } //返回Map的第一个Key public K firstKey() { return key(getFirstEntry()); } //返回Map的最后一个Key public K lastKey() { return key(getLastEntry()); } //生成Map子集 由fromKey(包含) 到 toKey(不包含)的键值组成 public SortedMap<K,V> subMap(K fromKey, K toKey) { return subMap(fromKey, true, toKey, false); } //生成Map子集 由键小于toKey的键值组成 public SortedMap<K,V> headMap(K toKey) { return headMap(toKey, false); } //生成Map子集 由键大于或等于fromKey的键值组成 public SortedMap<K,V> tailMap(K fromKey) { return tailMap(fromKey, true); }
3.LinkedHashMap
为了提高速度LindedHashMap散列化所有的元素,但是遍历键值对时又以元素的插入顺序返回键值对。
*可以在构造函数中设定LinkedHashMap,使之采用基于访问的最近最少使用(LRU)算法。
// 初始化大小,加权因子,true开启LRU算法 false插入顺序public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; }