1、Collection接口和Collections包装类:
Collection概念:是一个集合接口,提供了对集合对象进行基本操作的通用接口方法。
有以下结构:
|--List
| |--LinkedList
| |--ArrayList
| |--Vector
| |--stack
|--Set
Collections: 包含各种有关集合操作的静态多态方法,且该类无法实例化,相当于一个工具类。
2、HashMap、HashTable和ConcurrentHashMap:
HashMap的特点:线程不安全,允许传入 null值,不能保存映射的顺序。由数组(默认长度为16)+链表组成,jdk1.8后,若其链表长度大于8,就会转变成红黑树。
ps:HashMap线程不安全,是因为多个对象同时对同一HashMap进行操作时,会导致脏读、数据丢失的发生。
详细参考:https://www.cnblogs.com/aspirant/p/8908399.html
HashTable:可以理解为线程安全的HashMap,为什么是线程安全的,因为它的put、remove、get方法都被synchronized修饰,使其同步,自然是线程安全的了。
ConcurrentHashMap:是线程安全且高效的HashMap,由Segment数组结构和HashEntry数组结构组成,Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。
一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
为什么安全:采用了分段锁技术,给Segment数组的每个元素加锁。
分段锁技术:大致含义就是,将资源分成多个段存储,再给这些资源分段分别配一把锁,这样线程访问其中一个资源也不影响其他线程访问其他分段的资源,大大提高了效率。
来源:https://www.cnblogs.com/cicada-luo/p/11483045.html