java容器(java编程思想第四版-读书笔记)

时间:2023-12-14 12:54:38

容器类库图

java容器(java编程思想第四版-读书笔记)

  
List(interface) 次序是List最重要的特点;它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素。(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
ArrayList* 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素,因为那比LinkedList开销要大很多。
LinkedList 对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:addFirst(),addLast(),getFirst(),getLast(),removeFirst(),和removeLast(),这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
  
Stack “栈”通常是指“后进先出”(LIFO)的容器。LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。本书作者不推荐使用java.util包下的Stack,推荐使用LinkedList实现自己的Stack。
public class Stack<T> {
private LinkedList<T> storage = new LinkedList<T>();
public void push(T v) { storage.addFirst(v); }
public T peek() { return storage.getFirst(); }
public T pop() { return storage.removeFirst(); }
public boolean empty() { return storage.isEmpty(); }
public String toString() { return storage.toString(); }
}
参考文章:栈和Java基础类的Stack类的源码实现,缺陷以及如何实现自己的Stack类
  
Queue(interface) 队列是一个典型的先进先出(FIFO)的容器。
LinkedList LinkedList提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现。Queue<T> queue = new LinkedList<T>();
Queue接口窄化了对LinkedLlst的方法的访问权限,以使得只有恰当的方法才可以使用,因此,你能够访问的LinkedList的方法会变少(这里你实际上可以将queue转型回LlnkedList,但是至少我们不鼓励这么做)。
PriorityQueue(Java SE5) 优先级队列. 当你在PriorityQueue上调用offer()方法来插入一个对象时,这个对象会在队列中被排序。默认的排序将使用对象在队列中的自然顺序,但是你可以通过提供自己的Comparator来修改这个顺序。PriorityQueue可以确保当你调用peek().poll()和remove()方法时,获取的元素将是队列中优先级最高的元素。
  
Set(interface) 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯—性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序
HashSet* 为快速查找而设计的Set。存入HashSet的必须定义hashCode()
TreeSet 保持次序的Set.底层为树结构。使用它可以从Set中提取有序的序列。元素必须实现Comparable接口
LinkedHashSet 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。元素也必须定义hashCode()方法
  
Map(interface) 一组成对的“键值对”对象,允许你使用键来查找值。
HashMap* Map基于数列表的实现(它取代了Hasbtable)。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器的性能
LlnkedHashMap 类似于HashMap.但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点.而在迭代访问时反而更快,因为它使用链表维护内部次序
TreeMap 基于红黑树的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparable或Comparator决定).TreeMap的特点在于,所得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map.它可以返回一个子树
WeakHashMap 弱键(wcak key)映射,允许释放映射所指向的对象。这是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此。键一可以被垃圾收集器回收
ConcurrentHashMap 一种线程安全的Map,它不涉及同步加锁。
ldentityHashMap 使用==代替equals()对“键”进行比较的散列映射。专为解决特殊问题而设计的

迭代器Iterator

1)Java的Iterator只能单向移动
2)使用方法iterator()要求容器返回一个Iterator()。 Iterator将准备好返回序列的第一个元素。
3)使用next()获得序列中的下一个元素。
4)使用hasNext()检查序列中是否还有元素。
5)使用remove()将迭代器新近返回的元紊删除。

Listlterator是一个更加强大的Iterator的子类型,它只能用于各种List类的访问。尽管Iterator只能向前移动,但是Listlterator可以双向移动。它还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。

Foreach与迭代器

forcach语法主要用于数组,但是它也可以应用于任何Collection对象。之所以能够工怍,是因为Java SE5引入了新的被称为Iterable的接口,该接口包含一个能够产生Iterator的iterator()方法,并
任何实现Iterable的类,都可以将且Iterable接口被foreach用来在序列中移动。