集合框架

Collection
List
ArrayList实现List接口
ArrayList的特点
- 排列是有序的,可重复的
- 底层是动态数组
- 线程是不安全的
- 查询快、增删慢
- 当容量不足时,自动扩展到当前长度的1.5倍
ArrayList的遍历方式
- foreach循环
- for循环:因为ArrayList有一个get()方法可以取出集合中的数据
- 迭代器:Iterator
ArrayList的优缺点
优点:
- ArrayList底层采用数组实现,是一种随机访问模式查找速度很快
- ArrayList在顺序添加数据时是很快的
缺点:
- 增删操作时,需要对数组进行一次复制操作,如果复制的数据很多就会很耗费性能
ArrayList比较适合顺序添加和随机访问的场景
ArrayList在JDK1.7和JDK1.8中的底层实现
在JDK1.7和JDK1.8中底层数组都是elemrntData。size代表数组中的有效长度
JDK1.7:
ArrayList list=new ArrayList();中调用空构造器时;会给elemrntData初始化长度,初始化长度的值为10;
当调用add()方法时;elemrntData[size++]=e(e为要添加的元素,最开始的size为0,当添加成功之后,size会加1),添加成功之后会返回true;
当数组的10个值都满了之后,数组会开始扩容,扩容的为原来的1.5倍;扩容之后再将原来的数组复制到新数组中,elemrntData会指向新的数组
JDK1.8:
ArrayList list=new ArrayList();中调用空构造器时;会给elemrntData初始化一个空的数组{};
当调用add()方法时, 才将elemrntData的初始化值变为10,其它的和JDK1.7相同
Vector,LinkedList实现List接口
Vector的特点
- 排列是有序的,可重复的
- 底层是数组
- 线程是安全的
- 查询快增删慢
- 当容量不足时,默认扩容当前容量的1倍
LinkedList的特点
- 排列是有序的可重复的
- 底层是双向循环链表数据结构
- 查询慢,增删快
- 线程是不安全的
ArrayList和Vector的区别
共同点:
- 都实现了List接口,排列都是有序的可重复的
- 底层都是数组扩容
不同点:
- ArrayList底层数组每次扩容都会增加0.5倍,而Vector增加的是1倍
- ArrayList是线程不安全的,效率高;Vector是线程安全的,效率低
ArrayList和LinkedList的区别
共同点:
- 都实现了List接口,排列都是有序的可重复的
- 都是线程不安全的
不同点:
- ArrayList是动态数组的数据结构,而LinkedList是双向循环链表数据结构
- ArrayList随机访问的效率比较高,因为LinkedList是采用链表的数据结构需要移动指针从第一个数据开始遍历
- LinkedList的增删比ArrayList效率高,因为ArrayList的增删会影响其他数据在数组中的下标
- LinkedList比ArrayList更占内存,因为LinkedList除了要存入数据之外还需要存入前一个数据的节点和后一个数据的节点
综合来说:当需要频繁的查询数据时,尽量使用ArrayList;而当频繁的增删数据时,尽量使用LinkedList
Set
HashSet实现set接口
特点:
- 排列是无序的,不允许重复
- 底层是Hash表
- 内部是HashMap
底层:底层是基于HashMap实现的,HashSet的值存入到HashMap中的key中,相关的HashSet都是调用HashMap实现
TreeSet 实现set接口
特点:
- 排列时无序的,不允许重复
- 底部是二叉树
LinkedHashSet
特点:
- 采用hash表进行存储,并且使用链表记录插入顺序;底层实现和HashSet相同只是多了一个链表记录插入顺序
- 排列是有序的,不允许重复
Map
HashMap
特点:
- key值不可以重复,value值可以重复
- key值只能有一个为null,value可以有多个为null
- 底部是hash表,数据结构:jdk1.7是数组加链表;jdk1.8是数组加链表加红黑树
- 线程不安全
HashMap实现原理
- HashMap的底层是hash表,其数据结构是数组加链表
- 当HashMap想要put一个数据时,需要先通过hashCode()方法计算出key的hash值,从而判断数据在数组中的下标;
- 在存储过程中如果出现hash值相同时,会先通过equals() 方法来比较key的值是否相等,如果相等新的value值将会代替原来的value值;如果不相等就会将数据的key-value值存入到链表之中
- 在JDK1.8中,如果链表的长度超过阀值(默认为8)时,链表会转化为红黑树
- 在获取数据时,直接通过hash值找到数组中对应的下标,再找到对应的key,然后取出对应的value值
从上面不难看出来:解决哈希冲突的方法,使用数组的存储方式,将冲突的key的对象存入到链表中,一旦发生冲突就会和链表中的key做进一步的对比
jdk1.7和jdk1.8的区别:
| 区别 | JDK1.7 | JDK1.8 |
|---|---|---|
| 存储结构 | 数组+链表 | 数组+链表+红黑树 |
| 存储数据的规则 | 没有哈希冲突时放到数组中,当有哈希冲突时,放入到链表中 | 没有哈希冲突时放到数组中,当有哈希冲突时:链表长度小于8时,放到链表中;链表长度大于8时,链表会转化为红黑树并且存放到红黑树中 |
| 插入数据的方式 | 当出现哈希冲突时,采用头插法(数组中存入最新的数据,原来的数据会向后移1位,放入发哦链表中) | 当出现哈希冲突时,采用尾插法(直接将先数据插入到链表/红黑树的尾端) |
HashMap数组扩容
当Map中的元素个数超过Entry数组的长度乘以负载因子(0.75)时;就会调用resize()方法,自动扩容到原来的两倍;
扩容之后的Node对象的位置要不在原来的位置,要不在原偏移量两倍的位置。
Hashtable
特点:
- key'值不能重复 value可以重复 无序的
- key和value都不能为null
- 线程安全的
- 底层是hash表
HashMap和Hashtable的区别
- HashMap的key可以有一个为null,value可以有多个为null;而Hashtable的key和value都不能为null
- HashMap底层数组的初始长度为16,扩容为原来的两倍;而Hashtable底层的数组初始化长度为11,扩容为原来的两倍加1
- jdk1.8之后HashMap中的链表长度超过8时,会转化为红黑树;而Hashtable没有这个机制
TreeMap
特点:
- 底层采用红黑树实现,
- key不能为空,value可以为空
- 是一个有序的集合
Collection和Collections的区别
- Collection是一个集合接口,直接继承他的有List和Set
- Collections是一个工具类,提供了静态方法,用于对集合中的排序,搜索等各种操作
Iterable、Iterator、iterator()的区别
Iterable中定义了一个iterator()的抽象方法,抽象方法要在具体的实现类(ArrayList)中得到实现,
iterator()的返回值是一个Iterator接口,Iterator接口中有两个经典的方法:hashNext()、next()(这两个方法是抽象方法需要具体的实现),在ArrayList中的内部类Itr中得到了具体的实现
posted on
浙公网安备 33010602011771号