常用的集合类
Map接口和Collection接口是所有集合框架的父接口
- Collection接口是List Queue Set的父接口
- Map接口的实现类主要包括HashMap、TreeMap、HashTable、ConcurrentHashMap等
- Set接口的实现有HashSet、TreeSet、LinkedHashSet等
- List接口的实现类有ArrayList、LinkedList、Vector等
集合框架的底层数据结构
- List接口(有序重复 索引访问)按照 添加顺排列
- ArrayList底层是Object[]数组 add的时候先计算容量,重新new一个新的数组,并复制到新数组
- LinkedList底层是双向链表 每个节点包含前继节点和后继节点信息,第一个找到最后一个 最后一个可以找到第一个,更灵活
- 两者的区别:数组和链表
- Set接口(无序不重复)
- HashSet(无序唯一): 通过hash算法来存值
- LinkedHashSet: 链表存值,按插入顺序
- TreeSet(有序唯一):底层是红黑树,支持排序
- Map接口
- HashMap: 1.8之前是数组+线性链表 1.8之后是链表达到一定程度变成红黑树 很重要 key是数组
- LinkedHashMap: 在HashMap底层数据结构的基础上增加一条双向链表 key是链表
- HashTable: 数组+链表(线程安全)
- TreeMap: 红黑树
list是存的单个对象 map是存的key-value形式 list的数据相当于map的key
HashMap底层原理
- 数组结构:存储区间连续、内存占用严重、空间复杂度大
- 优点:随机读取和修改效率高,原因数组是连续的
- 缺点:插入和删除效率低,因插入数据,这个位置的数据在内存中都要往后移动,大小固定,不易动态扩展
- 链表:存储区间离散、占用内存宽松、空间复杂度小
- 优点:插入删除速度快、内存利用率高,没有固定大小,扩展灵活
- 缺点:不能随机查找,每次都从第一个开始遍历(查询效率低)
- 分类: 单链表和循环链表
- HashMap的数据结构 hash表结构:结合了数组和链表的优点
- 节点为数组 每个节点是链表
- put的时候 得到key的hash值,将hash值转换成数组的下标,如该下标有值,添加到该节点链表的末尾
- get的时候 得到key的hash值,将hash值转换成数组下标,通过下标找数组里面的值,如果存在节点,再对链表上的每个key进行比较,相同的就返回
- 增删在节点链表上完成 查询只扫描数组
- 需要重写equals 因为默认比较的是内存地址
1.7和1.8的区别
- 在1.8中 当hash表的单一链表长度超过8个的时候,链表结构就会转换成红黑树(平衡二叉树),查询效率提高一倍
- 红黑树的特性
- 每个节点要么是红色,要么是黑色,跟节点永远是黑色
- 每个红色节点的两个子节点一定是黑色
- 红色节点不能连续
- 所有叶子节点都是黑色的
- hashmap的默认容量是16
- 扩容是成倍增加
- 自己设置时,计算该数大的第一个2的幂作为初始容量(设置为5 初始容量是6)
- 负载因子 默认是0.75
- 到个数size超过了总容量*负载因子 时就会扩容
数组和集合的区别
- 数组长度不可变而且无法保存具有映射关系的数据;集合用于保存数量不确定的数据,以及具有映射关系的数据
- 数组 元素可以是基本类型的值,也可以是对象,集合只能报错对象
List和Set的区别?
- List可以包含重复元素,而Set包含唯一项。
- List是一个有序集合,它维护插入顺序,而Set是一个无序集合,不保留插入顺序,单linkedSet是有序的
- List接口可以允许n个null值,而Set接口只允许一个null值。
- Set 检索元素效率低下, 删除和插入效率高, 插入和删除不会引起元素位置改变。
- List: 和数组类似, List 可以动态增长, 查找元素效率高, 插入删除元素效率低, 因为会引起其他元素位置改变