集合
常用的集合如下:
List
继承Collection接口,下面有ArrayList、LinkedList。
ArrayList
ArrayList底层采用动态数组实现
如果没有指定长度,则默认长度为0,当插入数据时,长度将变为10,当数据量大于当前长度时,将会扩容
扩容:会创建一个长度为1.5倍的新数组,并将当前数组的元素拷贝到新数组中,当前数组的内存被释放
插入:有序的,从头部开始往后依次插入
删除:删除该元素,该元素以后的元素会前移一个位置
查询:根据数组下标快速访问数组中的元素
ArrayList在存储和删除时效率比较低,但在查询遍历时效率非常高
LinkedList
LinkedList底层采用双向链表实现
没有容量大小的定义,每个元素都有prev节点,next节点(指向上一个/下一个元素)
插入:需要修改要插入位置的前一个元素的next值和后一个元素的prev值即可
删除:需要修改前一个元素的next值指向后一个元素,后一个元素的prev值指向前一个元素即可
查询:需要从头到尾依次遍历,直到找到为止
LinkedList在存储和删除时效率较高,但在查询时效率比较低
Map
Map下面有HashMap、TreeMap,键值对式存储(key-value)
HashMap
hashMap基于哈希表,由数组、链表、红黑树组成
如果没有指定长度,则默认长度为0,当插入数据时,长度将变为16,(加载因子为0.75)当数据量大于当前长度的3/4时,将会扩容为原来的2倍,最大容量:2^30
当同一个位置的元素数量大于1时,由数组变为链表,当大于8时,由链表变为红黑树
同理,当元素数量小于6时,红黑树变为链表,当元素小于2时,变回数组
添加(put)如下图:
TreeMap
底层采用红黑树实现,所以没有容量和扩容的说法,有序的。
有序:如果key是自然数,就按照大小排序;如果是对象,则按照hash值进行排序
Set
Set接口是Conllection的子接口,下面有HashSet、TreeSet
存储的元素是无序的,不可重复的,只有add方法,没有get方法
HashSet
底层采用哈希表实现的,实际上是一个HashMap,无序,不可重复
判断是否相同元素:计算hashcode和equals,两个都相同才算相同
TreeSet
底层采用红黑树实现,实际上是一个TreeMap,无序,不可重复
判断是否相同元素:compareTo方法的返回值,0为重复
三者区别
- List 集合中对象是有序的,可以有重复对象
- Map 集合中每个元素以键值对(key - value)存储,键不可以重复,值可以重复
- Set 集合中对象是无序的,没有重复的对象