体系
Collection
接口List
接口:按照顺序插入数据,可重复ArrayList
实现类LinkedList
实现类
Set
接口:不可重复的集合HashSet
实现类:无序、不可重复、无索引LinkedHashSet
实现类:有序、不可重复、无索引TreeSet
实现类:可排序、不可重复、无索引
Queue
接口:队列LinkedList
实现类ArrayBlockingQueue
实现类PriorityQueue
实现类
Map
接口HashMap
实现类Hashtable
实现类
ArrayList
底层通过数组实现,可理解为扩容数组
ArrayList
的插入,可能涉及数组元素的移动、扩容
创建ArrayList
对象
不传递类型参数和长度参数,直接构造:ArrayList list = new ArrayList();
。
此时list
可以包含各种类型的数据,底层是长度为0的数组
可以传入长度参数,指定数组初始长度:ArrayList list = new ArrayList(10);
可以传入另一个同类型集合作为参数
⚠️ArrayList
扩容机制:无参构造时,创建长度为0的数组,第一次add
时,底层创建长度为10的数组。存满时,扩容1.5倍,如果1.5倍还不够存,那么以新数组的实际长度为准
常用方法
add(e)
:末端添加数据e
add(i, e)
:索引i
位置增加元素e
addAll(Collection c)
:把集合c
中的元素全加进调用的对象size()
:集合中元素个数get(i)
:获取索引i
位置处的元素set(i, e)
:设置索引i
处元素为e
(有返回值,是修改前的值remove(i)
:删除索引i
处的元素(有返回值,是删除的元素值- 可用
enhance for
遍历 indexOf(e)
:返回e
的第一个索引,若不存在,返回-1
lastIndexOf(e)
:返回e
的最后一个索引,若不存在,返回-1
boolean contains(e)
:是否存在e
boolean isEmpty()
:ture
表示集合空clear()
:清空toArray()
:把集合变成数组类型clone()
:复制新对象
LinkedList
底层是双链表实现,查询慢,增删快
创建LinkedList
对象
和ArrayList
类似,不再赘述
常用方法
添加元素
add(e)
:在末端添加元素e
add(i, e)
:在索引i
位置添加元素e
pop(e)
:在链表最前面添加元素e
addFirst(e)
:头插e
addLast(e)
:尾插e
addAll(Collection c)
:将c
中的数据都添加
获取元素
get(i)
:获取索引i
位置处的元素getFirst()
:获取第一个元素getLast()
:获取最后一个元素- 可用
enhance for
按顺序遍历 contains(e)
:是否包含元素e
indexOf(e)
:获取e
的第一个索引lastIndexOf(e)
:获取e
的最后一个索引
修改元素
set(i, e)
:将索引i
的元素设置为e
删除元素
remove()
:默认删除第一个元素pop()
:弹出第一个元素remove(i)
:删除索引i
位置remove(e)
:删除元素e
removeFirst()
removeLast()
clear()
:清空
其他
size()
:获取长度isEmpty()
“:是否为空
补充 比较器
ArrayList
和LinkedList
有排序方法sort()
,对于一维数组可以实现默认升序
我们可以自己指定排序方式,需要传入比较器类对象,这个类必须实现Comparator
接口,重写compare
方法
compare
方法需要指定类型参数,返回一个int
,传入Object
对象o1
和o2
。返回0
表示两个对象值“相等”;返回正数,说明o1>o2
,那么o1
要排到o2
后面,实际就是降序;返回负数,说明o1<o2
,o1
排在o2
前面,就是升序
HashSet
特点:无序存储,保证集合中元素唯一,不重复
底层是数组+链表(JDK 8 以前),数组+链表+红黑树(JDK 8开始),元素加入HashSet
时,通过哈希算法计算应该存储的位置。采用一定方法解决冲突(数组+链表,拉链法)
哈希值:根据hashCode()
方法计算出来的整数值。该方法定义在Object
类中,所有对象都可以调用,默认用地址值进行计算;一般情况会重写hashCode()
方法
- 达到装填因子时,扩容为原来的两倍
- 链表长度>8,并且数组长度>=64,转化为红黑树
- 自定义类型,必须重写
euqals
和hashCode
方法
常用方法
创建
Set<Integer> set = new HashSet<Integer>();
可以不指定类型参数,存储任意类型
添加元素
add(e)
:将元素e
添加addAll(Collection c)
:将集合c
里面的元素添加进去
访问元素
enhance for
遍历
删除元素
remove(e)
:删除元素e
clear()
:清空
其他
isEmpty()
:判断集合是否为空contains(e)
:判断集合是否包含e
clone()
:克隆对象
LinkedHashSet
底层还是哈希表,但增加了双链表机制,保证有序:存储和读取的顺序相同
TreeSet
底层:采用红黑树实现。(不需要重写hashCode
和equals
不可重复、无索引。
支持排序
- 默认按照元素从小到大的顺序排,对于
Integer
、Double
,按照值从小到大排;对于字符串、字符类型,按照ASCII数字顺序 - 自定义类型的对象排序,需要让类实现
Comparable
接口,重写compareTo
方法,否则添加入TreeSet
会报错
- 构造
TreeSet
的时候,传递比较器,实现Comparator
接口,重写compare
方法
Queue
实现类包括LinkedList
、ArrayBlockingQueue
和PriorityQueue
ArrayBlockingQueue
底层是数组,构造时需要传入参数,指定长度。队列满无法再入队
LinkedList
是链队
PriorityQueue
是优先队列,小顶堆
常用方法
add / offer
:队尾添加元素。对于长度有限制的队列,队列满时,add
会抛出uncheck
异常,offer
会返回false
remove / poll
:移除队头元素,并返回该元素。队列空时,remove
会抛出异常,poll
会返回null
element / peek
:返回队头,但是不删除。队列空时,和上述类似isEmpty
:判断队列是否为空size
:返回队列长度contains(e)
:判断是否包含元素e
clear()
:清空队列
HashMap
底层和HashSet
一样
存储对象是K-V(键值对)
常用方法
添加 / 修改数据
put(key, value)
:将K-V添加。(覆盖原本的值,可以用于修改数据,返回被修改之前的值putIfAbsent(key, value)
:如果不存在key
,那么插入K-V;如果存在,不做任何操作replace(key, value)
:修改key
对应的value
,返回修改前的值。不存在key
的话,不做修改
获取数据
get(key)
:获取key
对应的value
getOrDefault(key, defaultValue)
:获取key
对应的value
,如果不存在key
,则返回defaultValue
containsKey(key)
:判断是否存在key
isEmpty()
:判断是否空
删除数据
remove(key)
:移除key
对应的键值对remove(key, value)
:删除特定的key-value,必须完全正确才能删除clear()
:清空
获取对象
Set keySet()
:返回key
组成的集合Collection values()
:返回value
组成的集合Set<Map.Entery<1,2>> entrySet()
:获取键值对对象的集合。可以再用getKey()
和getValue()
获取键值
LinkedHashMap
底层和HashMap
一样,在此基础上,增加了双链表,保证有序:数据存储和取出顺序一致
TreeMap
底层和TreeSet
一样,采用红黑树
特性由key
决定:不重复、可排序、无索引
排序实现:
- 实现
Comparable
接口,重写compareTo
方法 - 构造时传入构造器,实现
Comparator
接口,重写compare
方法
Hashtable
区别于HashMap
- 实现方式不一样,继承的父类不同
- 底层结构的容量不同,默认
HashMap(16)、Hashtable(11)
HashMap
的K-V可以是null
,而Hashtable
不可以HashMap
线程不安全,效率高;Hashtable
相反HashMap
数据存储采用Hash算法,而Hashtable
采用hashcode
补充:迭代器Iterator
迭代器是集合专用的遍历方式,类为Iterator
集合获取迭代器对象
Iterator<E> iterator()
方法:获取迭代器,默认指向当前集合的0索引
Iterator
中的常用方法
boolean hasNext()
:检查当前位置是否存在元素E next()
:获取当前位置的元素,并将迭代器移向下一个位置
NoSuchElementException
异常:当前指向位置没有元素- 迭代完后,指针不会复位
- 迭代过程中,不要使用集合的方法进行增删
Collections
工具类
常用API
public static <T> boolean addAll(Collection<T> c, T... elements)
:往集合c
批量添加elements
public static void shuffle(List<?> list)
:打乱List
集合元素的顺序