Java提供了三大类容器:数组——将数字与对象联系起来;Collection——保存单一的元素;Map——将对象与对象相关联。
一、Collection
- Arrays.asList()接受一个数组或是一个用逗号分隔的元素列表,并将其转换为一个List对象;
- Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,将元素添加到Collection中;
- Collections是一个工具类,包括了sort、reverse、min、max、copy等方法;
1. List
ArrayList,适用于随机访问比较多的情况;LinkedList,提供了优化的顺序访问,适用于插入和删除较多的情况;
- retainAll() —— 允许你很容易地从较大的列表中创建出一个片段;
- containsAll() —— 判断某个列表是否包含另一个列表的所有元素(不管顺序);
- retainAll() —— 得到两个列表的交集,所产生的行为依赖于equals()方法;
- removeAll() —— 接受一个集合,删除所有与其相同的元素;
- replace() —— 替换元素;
- addAll() —— 重载了Collection的addAll()方法(只能在表尾添加),使其可以在list中间插入新的列表;
- isEmpty() —— 判断是否为空;
- clear() —— 清空;
- toArray() —— 将任意Collection转为数组;
2. Stack
“后进先出”,最后“压入”栈的元素,第一个“弹出”栈。
LinkedList具有能够直接实现栈的所有功能的方法:
public class Stack<T> {
private LinkedList<Object> storage = new LinkedList<>();
public void push(Object o) {storage.addFirst(o);}
public Object peek() {
return storage.getFirst();
}
public Object pop() {
return storage.removeFirst();
}
public boolean empty() {
return storage.isEmpty();
}
public String toString(){
return storage.toString();
}
}
3. Set
Set不保存重复的元素。它常被使用于测试归属性,你可以容易地查询某个对象是否在某个set中。正因为如此,查找就成为了Set中最重要的操作,因此你通常会选择一个HshSet的实现,它专门对快速查找进行了优化。
HsahSet是没有顺序的,它使用散列的数据结构,如果要对结果进行排序,可以用TreeSet代替它。
例如set里的元素是String类型,这里的排序是按字典序进行的,大写和小写字母会被划分到不同的组中。如果要按照字母序排序,可以向TreeSet的构造器传入String.CASE_INSENSITIVE_ORDER比较器。
public static void main(String[] args) {
Set<String> words = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
words.addAll(new TextFile("SetOperations.java","\\W+"));
System.out.println(words);
}
4. Queue
队列是一个典型的“先进先出”的容器。即从容器的一端放入元素,从另一端取出。队列常被当做一种可靠的将对象从程序的某个区域传输到另一个区域的途径。队列在并发编程中特别重要。
LinkedList实现了Queue接口,因此可以用作queue的一种实现。
Queue | LinkedList | 行为 |
---|---|---|
offer() / add() | addLast() | 队尾插入元素 |
peek() / element() | get() | 返回队头,peek在为空时返回null,其他两个抛异常 |
poll() / remove() | remove() | 删除并返回队头,poll在为空时返回null,remove抛异常 |
5. PriorityQueue
优先级队列声明下一个弹出元素是最需要的元素。
PriorityQueue调用offer()方法来插入一个对象时,这个对象会在队列中被排序,我们可以通过提供自己的Comparator来修改这个顺序。可以确保当你调用peek()、poll()和remove()方法时,获取的元素将是队列中优先级最高的元素。
6. 迭代器
迭代器是一个对象,它统一了对容器的访问方式。
- 使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素;
- 使用next()获得序列中的下一个元素;
- 使用hasNext()检查序列中是否还有元素;
使用remove()将迭代器新近返回的元素删除。
适配器惯用方法迭代器,详见thinking in Java P243
二、Map(关联数组)
将对象映射到其他对象的能力是一种解决变成问题的杀手锏。
- HashMap —— 最快的查询速度;
- TreeMap —— 按照比较结果的升序保存键;
- LinkedHashMap —— 案中案查询顺序保存键,同时保留了HashMap的查询速度;
- containsKey() —— 判断是否存在某个key;
- containsValue() —— 判断是否存在某个value;