1、为什么要用集合框架
当我们需要保持一组一样(类型相同)的元素的时候,我们应该使用一个容器来保存,数组就是这样一个容器。
因为数组一旦定义,长度将不能再变化(数组的缺点:定容)。
所以,我们需要一些能够动态增长长度的容器来保存我们的数据。
即我们将数据结构在Java中实现,于是就有了我们的集合框架。
在数组定容的时候,我们只能使用该数组的固定的容量。 所以我们自己写了一个MyArray类,这个类可以使代码自动扩容的功能。
MyArray类代码
测试类TestMyArray
集合框架框图
1.1 集合框架的定义
java集合框架就是一种工具类,就像是一个容器,可以存储任意数量的对象。
1.2 List集合
List集合中常用语法
返回类型 | 方法名称 | 描述 |
boolean | add(Object o) | 往集合中添加元素 |
int | size() | 集合中元素的个数 |
Object | get(int index) | 返回指定集合下标位置的元素 |
boolean | removeAll(Collection col) | 删除集合所以元素 |
boolean | contains(Object o) | 判断集合中是否存在指定元素 |
boolean | remove(Object o) | 从集合中删除元素 |
Object | remove(int index) | 从集合中删除指定位置的元素 |
1.3 ArrayList类特点
- 实现了List接口
- 可以动态扩容(我们只管存,长度不够,底层会自动的扩容)
- 通过下标可以快速访问数据
- 查找快,插入删除慢
- ArrayList底层是数组,对数组做了封装
- 可以存储任意类型的数据,包括null
- 数据按照存储次序排列
- 数据可以重复
- 多线程访问时不安全
1.3.1 创建和使用ArrayList
1.3.1.1 创建集合对象
1.3.1.2 添加元素
1.3.1.3 删除元素
1.3.1.4 修改元素
1.3.1.5 查看操作
1.3.2 LinkedList 的使用和创建
1.3.2.1 LinkedList的创建
1.3.2.2 添加操作
1.3.2.3 删除操作
1.3.2.4 修改操作
1.3.2.5 查看
1.3.3 ArrayList底层源码
1.4 LinkedList 的使用
LinkedList集合是一个链表结构。具有List的特征。可以进行头尾元素的添加删除。
LinkedList和ArrayList的区别:ArrayList底层体现的数据结构是数组,而LinkedList底层体现的数据结构是链表。
1.4.1 添加操作
1.4.2 删除操作
1.4.3 修改操作
1.4.4 查询操作
1.4.5 LinkedList底层源码
2、Set接口及实现类
2.1 Set接口的特点
- Set接口是无序的
- Set接口中的数据不允许重复
- Set接口无法通过下标访问数据
- 查找慢,插入删除快(底层数据结构是哈希表和红黑树)
- Set集合使用equals()和hashCode()方法实现元素去重
2.2 HashSet实现类
2.2.1 HashSet特点
- HashSet是Set接口的实现类
- 线程不安全
2.2.2 创建HashSet对象
2.2.3 添加操作
2.2.4 删除操作
2.2.5 查询操作
2.2.6 遍历
2.2.6.1 foreach遍历
2.2.6.2 迭代器遍历(Iterator)
2.2.7 HasSet源码
2.3 TreeSet实现类
2.3.1 TreeSet特点
- 有序
- 不重复添加、删除、
- 判断元素存在性效率比较高
- 线程不安全
2.3.2TreeSet操作
2.3.2.1 存储String类型的元素
2.3.2.2 存储对象类型
此时编译器会报错
解决方法:1、让Student类实现Comparable接口
2、在创建TreeSet时指定排序对象,主要用TreeSet集合的带参构造,其底层源码为:
所以要实现Comparable接口, 我们要自定义类实现Comparable接口。具体代码如下:
Student类:
自定义类Comparable接口:
测试类:
3、Map接口及其实现类
Map接口特点:
- 以键值对方式存储数据(Collection是单值集合)
- 键不能重复,键重复时,后面的数据会覆盖前面的数据
- 可以存储null键值对
- 数据无序
3.1 HashMap实现类
HashMap实现了Map接口,拥有Map接口的基本特点。HashMap线程不安全,效率高。HashMap的底层是由哈希表、链表加红黑树构成的。
3.2 创建HashMap对象
3.3 添加操作
3.4 删除操作
3.5 修改操作
3.6 查询操作
3.7 HashMap底层原理
JDK1.8 HashMap原理
存储元素使用put(key,value),根据key的hash计算出相应得哈希值,根据相应的算法求出该元素在数组中的位置, 如果求出的哈希值相同,则称为哈希冲突,会根据equals()来判断元素是否一致,如果equals不同,则挂在单向链表上(就是数据结构中的链地址法解决冲突), 如果哈希碰撞得个数超过8个,则把链表转换为红黑二叉树。
3.8 HashTable实现类
4、泛型
5、总结
- 需要数据唯一时,使用Set集合
- 需要保持规则顺序,此时用TreeSet
- 不需要指定顺序,此时用HashSet
- 需要保证代码添加数据的次序,此时用LinkedHashSet
- 不需要数据唯一时,用List集合
- 需要频繁增删操作时,使用LinkedList
- 不需要频繁增删操作,需要做大量查询操作时,使用ArrayList
- 如果以键值对方式存储数据时,使用HashMap