集合
集合
集合: 是一个容器,存储 引用类型的数据
集合和数组容器的区别
# | 数组 | 集合 |
---|---|---|
1 | 可以存储基本类型与引用类型 |
只能存储引用类型 |
2 | 长度固定的 |
变长的容器 |
Collection
类型:interface,继承Iterable
单列,可以重复存储
# | 常用方法 |
---|---|
1 | isEmpty() |
2 | size() |
3 | addAll(集合) |
4 | remove() |
5 | removeAll(集合) |
6 | contains() |
7 | toArray() |
8 | clear() |
List
类型:interface,继承Collection
有序,按照元素添加的顺序分配索引,从0开始
# | 常用方法 |
---|---|
1 | add(index,element) |
2 | get(index) |
3 | set(index,element) |
4 | sort(Comparator) |
5 | subList(start,end) |
关于sort排序
list.sort((s1,s2)-> s2.compareTo(s1));//自定义排序
list.sort(null);// null 没有自定义规则
实现类:
-
ArrayList
底层是数组public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
- Vector
- Stack
- LinkedList
底层是链表- 单向链表
- 双向链表
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
Set
类型:interface,继承Collection
唯一存储,无序
实现类:
-
HashSet
唯一存储,无序,底层哈希表
哈希表:将一组关键字映射到地址集上
底层实际是HashMappublic boolean add(E e) { return map.put(e, PRESENT)==null; }
- HashSet > LinkedHashSet
底层是 链表 和 哈希表
用链表来维护次序,
按元素的添加顺序 - SortedSet接口
- NavigablesSet接口
- TreeSet 实现类
底层:二叉树
有序:默认自然升序,可以自定义次序Set<Integer> set1 = new TreeSet<>((n1,n2)-> n2 - n1);
- TreeSet 实现类
- NavigablesSet接口
Queue
类型:interface,继承Collection
-
Deque接口
实现类:- ArrayDeque
受限:只能向队尾添加元素,只能从对头删除元素
# 添加 删除 获取列表头元素 操作失败时 1 add remove element 会产生异常 2 offer poll peed 不会产生异常,返回特定值 - LinkedList
- ArrayDeque
Map
# | 常用方法 |
---|---|
1 | size() |
2 | isEmpty() |
3 | containsKey() |
4 | containsValue() |
5 | remove() |
6 | keySet() |
7 | values() |
8 | clear() |
实现类:
- HashMap
底层哈希表
线程非安全
键唯一,无序
支持null/null- LinkedHashMap
支持null/null
按元素添加的顺序
- LinkedHashMap
- HashTable
线程安全
接口:
- SortedMap<K,V>
- NavigableMap<K,V>
- TreeMap实现类
不支持null/null
有序,默认自然顺序,自定义顺序//1. 匿名对象 map.forEach(new BiConsumer<Integer,String>() { @Override public void accept(Integer t, String u) { System.out.println(t + "," + u); } }); //2.forEach map.forEach((k,v)-> System.out.println(k + "," + v)); // 3. Iterator 迭代器支持集合类型 Set<Entry<Integer,String>> set= map.entrySet(); // 获得迭代器对象 Iterator<Entry<Integer,String>> i = set.iterator(); //i.forEachRemaining(System.out::println);// 输出键值对信息 i.forEachRemaining(e -> System.out.println(e.getKey()+"," + e.getValue()));
- TreeMap实现类
- NavigableMap<K,V>
迭代器
Iterator
# | 常用方法 |
---|---|
1 | forEachRemaining() |
2 | hasNext() |
3 | next() |
4 | remove() |
ListIterator
# | 常用方法 |
---|---|
1 | add(E) |
2 | hasNext() |
3 | hasPrevious() |
4 | next() |
5 | nextIndex() |
6 | previous() |
7 | previousIndex() |
8 | remove() |
9 | set(E) |
ListIterator<String> li = list.listIterator();
// 向后遍历
while(li.hasNext()) {
System.out.println(li.next());
}