一.集合结构框架
1.单列集合Collection
单列集合是一次存储一个数据的集合
⑴结构框架
List系列集合:添加的元素是有序,可重复,有索引
Set系列集合:添加的元素无序,不重复,无索引
2.双列集合Map
双列集合是一次存储一对数据的集合
二. Collection
1.概念
Collection是单列集合的顶层父接口,它的功能是全部单列集合都可以继承使用
2.常见方法
⑴方法细节
Ⅰ.boolean add(E e)
细节①:如果向List系列集合添加元素,方法永远返回true,因为可重复
细节②:如果向Set系列集合添加元素,如果当前添加元素不存在,会返回false,表示添加失败,因为不可重复
Ⅱ. remove
因为Collection里面定义的是共性的方法,所以不能通过索引删除,只能通过元素对象删除
Ⅲ. comtains
方法底层是通过equals方法判断对象是否一致的
如果集合存储的是自定义对象,想要通过contains方法查询元素是否存在,就要在JavaBean类中重写equals方法
3. Collection的三种遍历方式(集合通用)
⑴迭代器遍历
迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式
特性:不依赖索引
Iterator中的常用方法
boolean hasNext() 判断当前位置是否有元素
E next() 获取当前位置元素,并将迭代器对象移向下一个位置
Collection集合获取迭代器
Iterator< E> Iterator() 返回迭代器对象
迭代器细节:
①一个迭代器对象只能遍历一次
②遍历时不能用集合的方法进行添加或删除
用集合方式添加或删除元素可能会导致指针异常从而程序报错
如果想要删除元素,可以使用Iterator类中的remove方法(没有add添加方法)
⑵增强for遍历
增强for是JDK5之后出现的,其底层就是迭代器
所有的单列集合和数组才能用增强for遍历
格式:
for(数据类型 变量名:数组或集合){}
⑶Lambda表达式遍历
void forEach( Consumer<? super E> action)
根据ArrayList类中的forEach方法,可以看到方法的底层是普通for遍历
要利用forEach遍历,我们就要实现Consumer接口并重写accept方法
三. List
1.概念
List类是一个接口,其父接口是Collection,因此Collection中的方法List都继承了
List系列集合有序,可重复,有索引
因为List有所以,所以多了很多操作索引的方法
2.特有方法
3. List的5种遍历方式
① 迭代器遍历
②增强for遍历
③Lambda表达式遍历
④普通for
⑤列表迭代器ListIterator
ListIterator是Iterator的子接口
其中比Iterator多了一个add添加元素的方法,因此在ListIterator迭代器遍历时,我们可以使用迭代器的添加和删除方法
其代码与Iterator迭代器的遍历逻辑基本一致
四. ArrayList
ArrayList集合底层是数组实现的
1.底层细节
①ArrayList可以自定义集合长度
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。
若自定义长度为0或空参,则会默认创建一个长度为0的数组,当添加元素时再换为长度为10的数组
2.方法摘要
⑶底层原理实现
https://blog.csdn.net/m0_74808313/article/details/130376172
五. LinkedList
1.概念
LinkedList是List接口的链表实现类
此类实现Deque接口,为add, poll提供先进先出队列操作,以及其他堆栈和双端队列操作
LinkedList集合底层数据结构是双链表,所有的操作都是按照双重链表的需要执行的
2.特有方法
LinkedList底层数据结构是双链表,查询慢,但是首位操作的速度是极快的
3.底层原理实现
①单向链表
https://blog.csdn.net/m0_74808313/article/details/130295707
②双向链表
https://blog.csdn.net/m0_74808313/article/details/130320890
六. Set
1.概念
Set类是一个接口,其父接口是Collection,因此Collection中的方法Set都继承了,其中的方法与Collection基本一致
⑴Set集合的重要实现类
HashSet:无序,不重复,无索引
LinkedHashSet:有序,不重复,无索引
TreeSet:可排序,不重复,无索引
2.方法摘要
3.Set的三种遍历方式
①迭代器
②增强for
③Lambda表达式
七.HashSet
1.概念
HashSet实现Set接口,由哈希表(HashMap)支持
也就是其底层采取哈希表存储数据
HashSet特点:无序,不重复,无索引
2.方法摘要
3.底层原理
数组+链表+红黑树
⑴引用构造方法时,方法底层会创建一个默认长度为16,加载因子为0.75的数组
⑵添加元素时,方法会根据元素的哈希值跟数组的长度计算出应存入的位置
⑶判断当前位置是否有元素
如果没有元素则直接存入;如果有元素则会通过equals方法比较元素属性值是否一样,一样的话表示元素重复,不存;不一样的话存入数组,形成链表
细节:当链表长度超过8且数组长度大于等于64时,链表会自动转换为红黑树,从而提高查找效率
八. LinkedHashSet
1.概念
LinkedHashSet具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代
其底层数据结构依然是哈希表,只是每个元素多了个双链表记录存储的顺序
2.方法摘要
LinkedHashSet是HashSet的子类,其完全继承了父类中的方法
3.底层原理
其底层数据结构依然是哈希表,其原理实现与HashSet一致,只是每个元素多了个双链表记录存储的顺序
九. TreeSet
1.概述
基于 TreeMap 的 NavigableSet 实现。使用元素的自然/默认顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法
TreeSet集合的底层结构是基于红黑树的数据结构实现排序的,增删改查性能都很好
TreeSet特点:可排序,无索引,不重复
2.TreeSet默认排序规则
①对于数值类型
默认按照从小到大的顺序进行排序
②对于字符,字符串类型
按照字符在ASCll表中的数字升序进行排序
③对于自定义对象类型
方式一:Javabean类实现Comparable接口指定比较规则
如图:我在自定义的Student类中实现了Comparable接口并指定比较规则
方式二:比较器排序
创建TreeSet对象时传递比较器Comparator指定规则
如图:在创建TreeSet对象时实现Comparator接口并重写compare方法指定比较规则
3.方法摘要
TreeSet实现Set接口,其方法与Set中的方法基本一致