Collection
List
ArrayList
add() //将元素插入到指定位置的 arraylist 中addAll() //添加集合中的所有元素到 arraylist 中clear() //删除 arraylist 中的所有元素contains() //判断元素是否在 arraylistget() //通过索引值获取 arraylist 中的元素indexOf() //返回 arraylist 中元素的索引值removeAll() //删除存在于指定集合中的 arraylist 里的所有元素remove() //删除 arraylist 里的单个元素size() //返回 arraylist 里元素数量isEmpty() //判断 arraylist 是否为空subList() //截取部分 arraylist 的元素sort() //对 arraylist 元素进行排序toArray() //将 arraylist 转换为数组toString() //将 arraylist 转换为字符串lastIndexOf() //返回指定元素在 arraylist 中最后一次出现的位置containsAll() //查看 arraylist 是否包含指定集合中的所有元素
LinkedList
add 和 offer :offer返回boolean值
peek
poll
offer
public boolean add(E e) //链表末尾添加元素,返回是否成功,成功为 true,失败为 false。public void add(int index, E element) //向指定位置插入元素。public void addFirst(E e) //元素添加到头部。public void addLast(E e) //元素添加到尾部。public boolean offer(E e) //向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。public boolean offerFirst(E e) //头部插入元素,返回是否成功,成功为 true,失败为 false。public boolean offerLast(E e) //尾部插入元素,返回是否成功,成功为 true,失败为 false。public void clear() //清空链表。public E removeFirst() //删除并返回第一个元素。public E removeLast() //删除并返回最后一个元素。public boolean remove(Object o) //删除某一元素,返回是否成功,成功为 true,失败为 false。public E remove(int index) //删除指定位置的元素。public E poll() //删除并返回第一个元素。public E remove() //删除并返回第一个元素。public boolean contains(Object o) //判断是否含有某一元素。public E get(int index) //返回指定位置的元素。public E peek() //返回第一个元素。public E peekFirst() //返回头部元素。public E peekLast() //返回尾部元素。public int size() //返回链表元素个数。public Object[] toArray() //返回一个由链表元素组成的数组。public T[] toArray(T[] a) //返回一个由链表元素转换类型而成的数组。
比较ArrayList和LinkedList
- 线程安全:都不安全,Vector保证线程安全
- 底层数据结构:数组 vs 双向链表
- 插入和删除是否受位置影响:受 vs 头尾不受,其他位置受
- 快速随机访问:支持 vs 不支持
- 内存:val vs val和指针
Set
HashSet
add();remove();clear();contains();size();isEmpty();
HashSet、LinkedHashSet 和 TreeSet 三者的异同:
- 线程安全:都不保证
- 底层实现:HashSet是HashMap,LinkedHashSet是
- 应用场景
Queue
| Queue 接口 | 抛出异常 | 返回特殊值 |
|---|---|---|
| 插入队尾 | add(E e) | offer(E e) |
| 删除队首 | remove() | poll() |
| 查询队首元素 | element() | peek() |
| Deque 接口 | 抛出异常 | 返回特殊值 |
|---|---|---|
| 插入队首 | addFirst(E e) | offerFirst(E e) |
| 插入队尾 | addLast(E e) | offerLast(E e) |
| 删除队首 | removeFirst() | pollFirst() |
| 删除队尾 | removeLast() | pollLast() |
| 查询队首元素 | getFirst() | peekFirst() |
| 查询队尾元素 | getLast() | peekLast() |
ArrayDeque 与 LinkedList
- 底层数据结构:可变长数组+双指针 vs 链表
- 存储null数据:不支持 vs 支持
- 从性能的角度上,选用 ArrayDeque 来实现队列要比 LinkedList 更好。此外,ArrayDeque 也可以用于实现栈
PriorityQueue
典型例题包括堆排序、求第K大的数、带权图的遍历
Map
HashMap
hashmap.replace(key, newValue);
hashmap.get(key);
hash.getOrDefault(key, default);
clear() //删除 hashMap 中的所有键/值对clone() //复制一份 hashMapisEmpty() //判断 hashMap 是否为空size() //计算 hashMap 中键/值对的数量put() //将键/值对添加到 hashMap 中remove() //删除 hashMap 中指定键 key 的映射关系containsKey() //检查 hashMap 中是否存在指定的 key 对应的映射关系。containsValue() //检查 hashMap 中是否存在指定的 value 对应的映射关系。replace() //替换 hashMap 中是指定的 key 对应的 value。replaceAll() //将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。get() //获取指定 key 对应对 valuegetOrDefault() //获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值forEach() //对 hashMap 中的每个映射执行指定的操作。entrySet() //返回 hashMap 中所有映射项的集合集合视图。keySet() //返回 hashMap 中所有 key 组成的集合视图。values() //返回 hashMap 中存在的所有 value 值。
底层实现
jdk1.8之后 数组+链表+红黑树
当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。
TreeMap
TreeMap它还实现了NavigableMap接口和SortedMap 接口
- NavigableMap 接口让 TreeMap 有了对集合内元素的搜索的能力
SortedMap接口让 TreeMap 有了对集合中的元素根据键排序的能力 默认按照key的升序排序 ```java public class Person { private Integer age;
public Person(Integer age) { this.age = age; }
public Integer getAge() { return age; }
public static void main(String[] args) {TreeMap<Person, String> treeMap = new TreeMap<>(new Comparator<Person>() {@Overridepublic int compare(Person person1, Person person2) {int num = person1.getAge() - person2.getAge();return Integer.compare(num, 0);}});treeMap.put(new Person(3), "person1");treeMap.put(new Person(18), "person2");treeMap.put(new Person(35), "person3");treeMap.put(new Person(16), "person4");treeMap.entrySet().stream().forEach(personStringEntry -> {System.out.println(personStringEntry.getValue());});}
}
<a name="jSRUE"></a>### ConcurrentHashMapjdk1.7<br />ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。<br />Segment 的结构和 HashMap 类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个 HashEntry 数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment 的锁。jdk1.8<br />ConcurrentHashMap 取消了 Segment 分段锁,采用 CAS 和 synchronized 来保证并发安全。synchronized 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,效率又提升 N 倍。<a name="t7o0Z"></a>## Collections工具类```javavoid reverse(List list)//反转void shuffle(List list)//随机排序void sort(List list)//按自然排序的升序排序void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑void swap(List list, int i , int j)//交换两个索引位置的元素void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面
int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素int frequency(Collection c, Object o)//统计元素出现次数int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target)boolean replaceAll(List list, Object oldVal, Object newVal)//用新元素替换旧元素
