java.util 库,基本的类型有 List 、 Set 、 Queue (集合)和 Map(映射)。
- List 必须以插入的顺序保存元素;
- Set 不能包含重复元素;
- Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同);
- map允许我们使用一个对象来查找另一个对象,它也被称作关联数组(associative array)。
添加元素组
Arrays.asList() 方法接受一个数组或是逗号分隔的元素列表(使用可变参数),并将其转换为 List 对象。== 输出作为一个 List ,但是这里的底层实现是数组,没法调整大小。==如果尝试在这个 List 上调用 add() 或 remove(),由于这两个方法会尝试修改数组大小,故会报错。
Collections.addAll() 方法接受一个 Collection 对象,以及一个数组或是一个逗号分隔的列表,将其中元素添加到 Collection 中。
Collection<Integer> collection = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Integer[] moreInts = { 6, 7, 8, 9, 10 };
collection.addAll(Arrays.asList(moreInts));
List
- ArrayList ,擅长随机访问元素,但在 List 中间插入和删除元素时速度较慢。
- LinkedList ,它通过代价较低的在List 中间进行的插入和删除操作,提供了优化的顺序访问。 LinkedList 对于随机访问来说相对较慢,但它具有比 ArrayList更大的特征集。
list通用方法:
list.add(object) or list.add(index, object); //添加
list.addAll(list1) or list.addAll(index,list1);
list.contains(object); //返回true or false ,是否包含
list.remove(object) or list.remove(index); //移除
list.removeAll(sublist);
list.get(index); //通过索引获取元素
list.indexOf(object); //获取该元素的索引值
list.subList(start,end); //获取切片,左闭右开
list.containsAll(sublist); //是否包含另一个列表,顺序不重要
Collections.sort(list); //升序排序
Collections.shuffle(list, new Random(47)); //随机排序
list.retainAll(collection); //集合交集,依赖于 equals() 方法。
list.set(index,object); //重置元素
list.isEmpty(); //判断列表是否为空
list.clear(); //清除所有元素
list.toArray();
LinkedList新增方法:
linkedList.getFirst() or linkedList.element() ; //返回列表的第一个元素而并不删除它,如果 List 为空,则抛NoSuchElementException 异常
linkedList.peek() ; //同上,只是在列表为空时返回 null
linkedList.removeFirst() or linkedList.remove() ;//删除并返回列表的头部元素,并在列表为空时抛出 NoSuchElementException 异常
linkedList.poll() //同上,只是在列表为空时返回 null
linkedList.addFirst() //在列表的开头插入一个元素
linkedList.offer() or linkedList.add() or linkedList.addLast() //在列表的尾部添加一个元素
linkedList.removeLast() //删除并返回列表的最后一个元素。
Iterator
使用 list.iterator() 要求集合返回一个 Iterator。 Iterator 将准备好返回序列中的第一个元素。
使用 iterator.next() 获得序列中的下一个元素。
使用 iterator.hasNext() 检查序列中是否还有元素。
使用 iterator.remove() 将迭代器最近返回的那个元素删除。
所有的集合类都实现了Iterable接口
listIterator
只能由List类生成,可以双向移动
list.listIterator() or list.listIterator(n); //指向开头处 and 指向第n个索引位置处
listIterator.hasNext() or listIterator.hasPrevious();
listIterator.next() or listIterator.previous();
listIterator.nextIndex() or listIterator.previousIndex();
Stack
后进先出,使用ArrayDeque实现
Deque<T> stack = new ArrayDeque<>();
stack.push(object);
stack.pop();//删除并返回顶部元素
stack.peek();//仅返回栈顶元素
stack.isEmpty();
Set
不保存重复的元素,最常见的用途是测试归属性,可以很轻松地询问某个对象是否在一个 Set 中。因此通常会选择 HashSet 实现,该实现针对快速查找进行了优化。
- TreeSet 将元素存储在红-黑树数据结构中,可以排序。
String类型按字典顺序排序,大小写敏感。构造时传入String.CASE_INSENSITIVE_ORDER参数,则不区分大小写。 - HashSet 使用散列函数
- LinkedHashSet 也使用散列来提高查询速度,但是使用了链表来维护元素的插入顺序。
Map
Key-value键值对形式
Map<Integer, Integer> m = new HashMap<>();
m.get(key) //根据key获取value
m.put(key,value) //存值
m.containsKey(key) //是否包含key值
m.containsValue(value) //是否包含value
m.keySet() //key集合
m.values() //所有的值
Queue
先进先出,使用LinkedList实现。Queue 接口窄化了对 LinkedList 方法的访问权限,因此只有适当的方法才能使用
Queue<Integer> queue = new LinkedList<>(); //声明
queue.offer();//添加元素
queue.peek();//返回头元素,queue为空返回null
queue.element();//返回头元素,queue为空报NoSuchElementException 异常
queue.poll();//删除并返回队头元素,queue为空返回null
queue.remove();//删除返回头元素,queue为空报NoSuchElementException 异常
优先级队列PriorityQueue
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
==Integer , String 和 Character 可以与 PriorityQueue 一起使用,因为这些类已经内置了自然排序。==如果想在 PriorityQueue 中使用自己的类,则必须包含额外的功能以产生自然排序,或者必须提供自己的 Comparator 。
总结
- 数组将数字索引与对象相关联。它保存类型明确的对象,因此在查找对象时不必对结果做类型转换。它可以是多维的,可以保存基本类型的数据。虽然可以在运行时创建数组,但是一旦创建数组,就无法更改数组的大小。
- Collection 保存单一的元素,而 Map 包含相关联的键值对。使用 Java泛型,可以指定集合中保存的对象的类型,因此不能将错误类型的对象放入集合中,并且在从集合中获取元素时,不必进行类型转换。各种Collection 和各种 Map都可以在你向其中添加更多的元素时,自动调整其尺寸大小。集合不能保存基本类型,但自动装箱机制会负责执行基本类型和集合中保存的包装类型之间的双向转换。
- 像数组一样, List 也将数字索引与对象相关联,因此,数组和 List 都是有序集合。
- 如果要执行大量的随机访问,则使用ArrayList ,如果要经常从表中间插入或删除元素,则应该使用 LinkedList 。
- 队列和堆栈的行为是通过LinkedList 提供的。
- Map 是一种将对象(而非数字)与对象相关联的设计。 HashMap 专为快速访问而设计,而TreeMap 保持键始终处于排序状态,所以没有 HashMap 快。 LinkedHashMap按插入顺序保存其元素,但使用散列提供快速访问的能力。
- Set 不接受重复元素。 HashSet 提供最快的查询速度,而 TreeSet保持元素处于排序状态。 LinkedHashSet 按插入顺序保存其元素,但使用散列提供快速访问的能力。
- 不要在新代码中使用遗留类Vector ,Hashtable 和 Stack 。
黄色为接口,绿色为抽象类,蓝色为具体类。虚线箭头表示实现关系,实线箭头表示继承关系。