![](https://img.kancloud.cn/2f/45/2f459861d963c59dddd56d7466da4381_643x611.png)
**1. AbstractCollection**
(1)实现了大部分的集合接口。
**2. AbstractList**
(1)继承于AbstractCollection,并且实现了大部分List接口。
**3. AbstractSequentialList**
(1)继承于 AbstractList ,提供了对数据元素的链式访问而不是随机访问。
<br/>
**4. LinkedList**
(1)实现了List接口,主要用于创建链表存储结构。
(2)无序;允许重复;允许存储null值。
(3)线程不安全,效率高。
(4)如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。
```java
List list = Collections.synchronizedList(new LinkedList(...));
```
(5)底层数据结构是双向链表,查询慢,增删快。
**5. ArrayList**
(1)实现了List接口。
(2)有序,插入顺序便是存储顺序;允许重复;允许存储多个null值。
(3)ArrayList 默认初始容量为10,每次增长当前长度的1.5倍。
(4)底层数据结构是动态数组,查询快,增删慢。
(5)线程不安全,效率高。在多线程的情况下不要使用。
<br/>
**6. AbstractSet**
(1)继承于AbstractCollection 并且实现了大部分Set接口。
**7. HashSet**
(1)实现了Set接口。
(2)无序,但遍历的顺序是固定的;元素唯一;允许存储一个null值。
(3)去重原理:根据hashCode()获取哈希值,根据equals方法判断哈希值是否相等,equals返回false,则元素添加到集合中。
(4)底层原理:使用HashMap实现,就是HashMap中的K,而V统一存储为Object的对象。
(3)底层数据结构是哈希表。
**8. LinkedHashSet**
(1)继承HashSet,实现了Set接口。
(2)底层原理:使用LinkedHashMap实现,根据元素的hashcode来决定元素真正的存储位置,同时再使用一个链表维护元素的次序,遍历的时候,看起来像是以插入顺序排布的,实际并不是。
(3)底层数据结构是哈希表+链接。
**9. TreeSet**
(1)该类实现了Set接口,可以实现排序等功能。
(2)有序;元素唯一;不允许存储null值,否则抛出异常。
(3)去重原理:能够存储到TreeSet的元素都实现了Comparable接口,如果元素的compareTo方法返回0则是重复的,否则不是重复的。
(4)排序原理:根据compareTo方法的返回结果进行排序。如果采用默认的compareTo则称为自然排序;如果我们重写compareTo,则称为定制排序。
(5)线程不安全,效率高。
(6)底层原理:使用TreeMap实现。
(7)底层数据结构是红黑树。
<br/>
**10. AbstractMap**
(1)实现了大部分的Map接口。
**11. HashMap**
(1)实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度。
(2)HashMap存储的内容是键值对(key-value)映射。
(3)允许 null 为键,但是必须是唯一的;可以存储 null 值。
(4)底层数据结构,在jdk1.7为数组+哈希表,在jdk1.8+中是数组+哈希表+红黑树。
(5)当链表长度超过阈值(8)时,将哈希表转换为红黑树,这样大大减少了查找时间。
(6)线程不安全,效率高。
**12. TreeMap**
(1)继承AbstractMap。
(2)存储的是有序的K-V集合,根据K进行排序。
(3)不允许 null 为键,否则抛出NullPointerException;可以存储 null 值。
(4)排序原理:能够作为TreeMap的键,则该键一定实现了Comparable接口,根据接口的compareTo返回结果进行排序。
(5)底层数据结构是红黑树。
**13. WeakHashMap**
(1)继承AbstractMap类,使用弱密钥的哈希表。
**14. LinkedHashMap**
(1)继承于HashMap,使用元素的自然顺序对元素进行排序。
**15. IdentityHashMap**
(1)继承AbstractMap类,比较文档时使用引用相等。
- 网络通信
- 网络协议
- 端口和套接字
- TCP网络程序
- UDP网络程序
- 多线程聊天室
- 多线程
- 线程相关概念
- 线程实现方式
- 中断线程
- 线程生命周期
- 线程优先级
- 优先级规则
- 案例演示
- 线程同步机制
- 线程同步机制
- synchronized关键字
- ReentrantLock类
- Condition类
- 监视器概念
- volatile关键字
- final变量
- 死锁
- 线程局部变量
- 读/写锁
- 原子类
- 阻塞队列
- 工作规则
- 案例演示
- 常用阻塞队列
- 线程安全集合
- 高效的映射/集/队列
- 并发集视图
- 写数组的拷贝
- Arrays类的并行数组算法
- 同步包装器
- Callable与Future
- 执行器
- 线程池
- 预定执行
- 控制任务组
- Fork-Join框架
- 同步器
- 同步器
- 信号量
- CountDownLatch类
- CyclicBarrier类
- Exchanger类
- SynchronousQueue类
- 线程与Swing
- Swing与线程问题
- 两个原则
- Swing工作线程
- 单一线程规则
- 文件IO
- File类
- 文件输入输出
- ZIP压缩文件
- 集合
- 集合框架
- 集合接口
- 集合实现类
- 线程安全集合
- 集合算法
- 迭代器
- 集合排序
- JDBC
- JDBC是什么
- JDBC-ODBC桥
- JDBC驱动程序类型
- JDBC常用类与接口
- 数据库操作
- 连接数据库
- 增/删/改/查/预处理
- 事务
- 批处理
- commons-dbutils工具
- 安全问题
- Jedis
- 使用Jedis操作Redis数据库
- JSON转换
- 使用连接池
- 案例
- 单例破坏
- 单例定义
- 单例实现方式
- 懒汉式实现单例
- 饿汉式实现单例
- 单例破坏
- 类的单例破坏
- 枚举的单例破坏
- 克隆
- 克隆是什么
- 浅克隆
- 深克隆
- 注解
- 注解是什么
- 三大注解
- 内置注解
- 元注解
- 自定义注解
- NIO
- 相关概念
- BIO/NIO/AIO
- 多线程编程
- 线程同步
- 线程通信
- NIO
- NIO三大核心组件
- NIO网络编程
- NIO文件读写
- AIO
- Java8新特性
- Lambda表达式
- 方法引用
- 函数式接口
- 默认方法
- 什么是默认方法
- 默认方法语法格式
- 多个同名的默认方法问题
- 静态默认方法
- 默认方法实例
- Stream
- Stream是什么
- Stream示例
- Optional容器
- 新的日期时间API
- Base64
- SPI
- SPI是什么
- SPI与API的区别
- 常见场景
- 使用SPI需遵循的约定
- SPI使用步骤