HashTable与hashmap差不多,但是没有红黑树只有普通的数组和链表且其方法是synchronized的
concurrentHashMap
- jdk1.7采用分段锁,就是多个数组合用一个ReentrantLock
- jdk1.8后采用cas和synchronized,当我们某个节点没有数据的时候我们采用cas插入。
- 如果存在节点,然后查看结果的hash是否是hash如果是MOVED,则说明该节点正在参与resize,那么该线程会协助进行resize。
- 如果hash不是MOVED则用synchronized进行锁,然后根据链表或者红黑树进行插入节点。
treeMap
- TreeMap 实现 SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。如果使用排序的映射,建议使用 TreeMap。在使用 TreeMap 时, key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的Comparator,否则会在运行时抛出 java.lang.ClassCastException 类型的异常。
LinkedList和ArrayList
- ArrayList
ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。 当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
- LinkedList
LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
Vector
- 与arrayList相似只是多了synchronized,底层也是采用数组
HashSet
- 底层采用hashMap
LinkedHashSet
- 底层采用LinkedHashMap
TreeSet
- 底层采用treeMap