集合/容器
集合概念
为了解决数据存储单一的情况,java中提供了许多不同结构的集合类,让我们可以根据不同的场景进行数据存储选择
集合API
集合体系概述
java的集合框架是由很多接口,抽象类,具体类组成的,都位于java.util包中
单列集合:一次放进去一个值(对象)
List接口及实现类
继承了Collection类,可以有重复元素
ArrayList:数组列表
底层有一个数组,可以动态扩展数组长度,并提供一个一系列方法操作
查询快,插入和删除慢
add()
默认是向末尾添加元素,先判断是否满,如果不满则添加元素,如果满了,则扩容
LInkedList:链表列表
底层是一个链表结构
查询慢,插入和删除快
Vector:数组列表,线程安全的
List接口集合迭代
List集合遍历方式
for循环
允许操作元素,注意索引的变化与元素位置的移动
增强for循环
不允许对元素进行操作
迭代器遍历
Set接口
Set中存储的元素是不重复的
HashSet
元素是无序的
我们向集合中添加一个元素时,如果每次都使用equals比较内容是否相等效率会很低
一般用的是hashcode(不是Object中的),会调用的是类中重写的hashcode,返回的是根据内容计算的哈希值,遍历时,会用哈希值先比较是否相等,但是哈希值会存在问题,内容不同,哈希值相同,此种情况下再调用equals来比较内容
TreeSet
可以给Set集合中的元素进行指定方式的排序,存储的对象必须实现Comparable接口,重写compareTo(),每次添加元素时,调用compareTo()进行元素大小判断(小于0放在左节点,等于0表示元素重复(不会覆盖原来的元素),大于0放到右节点)
双列集合
Map接口
共性:键不能重复,值可以重复,通过键可以找到值,一个键只能映射一个值
HashMap
可以存储一个为null的键,值可以为null
底层使用的是Node类型的数组,数组默认长度为16,数组的每个位置上都是一个链表,当链表长度大于8且数组长度大于64时,链表会转化为红黑树,添加元素的时,会通过键的哈希值来确定数组的位置,如果添加的元素与已有的元素重复,那么覆盖原有的元素,如果没有重复,则添加到next节点上
键是无序的,key不能重复
TreeMap
底层使用的是树结构
Hashtable
方法上都添加了锁
不能存储为null的键和为null的值
Map遍历
1.先拿到所有的键,遍历键,根据键寻找值
2.使用entryset遍历
Collections类
addAll
添加一个能改变长度的数值到集合里
swap
交换对应位置上的元素
copy
集合复制,将源集合复制到目标集合,要求目标集合size大于等于源集合
fill
用指定的值,替换到集合中的所有元素
shuffle
随机排序
下图是集合的结构图