源码分析导航
ArrayList:https://blog.csdn.net/MOKEXFDGH/article/details/88575150
LinkedList:https://blog.csdn.net/MOKEXFDGH/article/details/88615783
HashMap:https://blog.csdn.net/MOKEXFDGH/article/details/88628558
ConcurrentHashMap:https://blog.csdn.net/MOKEXFDGH/article/details/88660349
文章目录
List, Set, Map 的区别
- List: 可以有多个元素引用相同的对象,有序对象。
- Set: 不允许有重复元素,不会有多个元素引用相同对象。
- Map: 存储键值对,key 可以引用相同对象,但是内容不能相同(String)。
ArrayList, Vector, LinkedList 区别
ArrayList和LinkedList:
ArrayList 底层使用的是数组,存读效率高,插入删除特定位置效率低。
LinkedList 底层使用的是双向链表,插入删除效率高,而读取效率低。
ArrayList和Vector:
Vector 类中所有方法都是同步的,可以多个线程安全地访问一个 Vector 对象。但是一个线程访问时,Vector 要在同步操作上耗费大量时间,效率低,此时可以使用 ArrayList,虽然不是同步的,但单线程下不需要同步,效率高。
HashMap 和 HashTable 的区别
- HashMap: 是非线程安全的,因此效率较高;允许有 null 的存在。
- HashTable: 是线程安全的,内部的方法基本都经过synchronized;只要有一个 null,就会直接抛出 NullPointerException 异常。
HashMap 和 HashSet 的区别
HashMap:
- 实现Map接口,存储键值对
- 调用 put() 方法添加元素
- 使用 key 计算 hashcode
HashSet:
- 实现Set接口,仅存储对象
- 调用 add() 方法添加元素
- 使用成员对象来计算 hashcode(相同用equals)
HashMap 和 ConcurrentHashMap 的区别
- ConcurrentHashMap: 线程安全(UNSAFE,CAS算法),且并发性能更好。对整个桶数组进行了分段(Segment),然后在每个分段上都用 lock 锁进行保护,并发性能更好;不允许有空值。
- HashMap: 非线程安全,允许有空值。
HashSet 检查重复
- 判断 hashcode 是否相等,即插入位置是否相同;不相同则说明没有重复出现
- hashcode 相同才会调用 equals 方法来检查对象是否真的相同,如果不相同才会确认不是重复元素;相同则不会插入。
comparable 和 comparator 的区别
- comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序。
使用方法:实现Comparable接口(implements Comparable),重写int comparableTo(Object o)方法。Collections.sort(list)排序。 - comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序。
使用方法:自定义类实现comparaor,并覆盖compare方法。Collection.sort(list,new 自定义类)。
数组和 List 相互转换
- List -> 数组:toArray(list.size())
- 数组 -> List:Arrays.asList(a)
ArrayList 集合的交集、并集、差集
主要的三个方法:
- addAll(Collection<? extends E> c) : 按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
- retainAll(Collection<?> c): 仅保留此列表中包含在指定集合中的元素。
- removeAll(Collection<?> c) : 从此列表中删除指定集合中包含的所有元素。