Java里的容器默认指的是: 集合,可以存储对象
集合分类两大类 :
Collection为顶层接口的单列集合
Map为顶层接口的双列集合
(它们都实现了Iterable接口:迭代器,方便遍历集合)
单列集合
常用的有: ArrayList、HashSet。
了解的有:LinkedList、LinkedHashSet。
ArrayList
ArrayList底层原理: 底层使用object[]数组进行存储,有默认容量,每次添加元素时检察容量,当容量不够的时候,会使用 System.arraycopy() 的方法将原数组复制并创建一个原数组一倍的新数组,将原数组数据插入新数组后赋值给原数组,新数组置为 null,等待回收。
特点: 可以存入 null 值、元素可以重复、存储时可以确保顺序、线程不安全,相较于LInkedList改查效率较为高效。
LinkedList
与 ArrayList 的区别在于,LinkedList 的 底层实现 是基于 一个双向链表
里面包含了大量 操作首位元素的方法(要使用这些特定的方法,就不能使用多态)
同样也是线程不安全
特点:相比ArrayList增删效率较为高效。
HashSet
HashSet底层原理: 基于HashMap实现,将数据存储在 HashMap的key中,value被定义默认定义为null,因为是基于HashMap实现所以该集合
特点:元素不可重复,可以存一个null值,不保证排列顺序。
LinkedHashSet
继承自 HashSet,重写了父类的方法实现构建双向链表结构,使得我们插入数据时能保证元素顺序
特点:元素不可重复,可以保证元素排列顺序。
双列集合
常用的: HashMap
HashMap
底层实现为:数组 + 链表(jdk1.8之前)
根据 要插入元素的 key 值,计算 hash码,根据 hash码,获取该key在 数组中的位置,如果hash码相同,则会 使用 equals() 比较内容,如果内容也相同,就认为两个key相同,把value 覆盖,否则,挂在已存在的 元素的下面,成为链式。
jdk1.8之后:数组 + 链表 + 红黑树
同上之后,如果 链表下挂在的元素个数超过 8个 则转换为 红黑树(当hashmap容量大于64时),当红黑树中元素的少于6个时则转换为链表
特点是:无序、key唯一不可重复。
LinkedHashMap
特点:有序,key唯一不可重复。