概述
为了保存这些数目不确定的对象,JDK中提供了一系列特殊的类,这些类可以储存任意类型的对象,并且长度可变,我们把它们统称为集合!这些类都位于java.util包中,是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。
框架图
Java集合
Collection集合
Iterator: 我们可以通过迭代器遍历集合中的数据;
Collection: Collection是List、Set、Queue 这3种集合的父级接口;
Map集合
Map: Map是映射表的父级接口。
集合的好处
1.简单而快速的就能查询集合中存储的数据
2.集合可以对数据进行排序,比如Set接口中就可以对集合进行自然排序或比较器排序。
3.集合的长度是可以改变的
4.集合可以去掉数据中重复的值
5.集合具有映射关系,比如,在双列集合中,我们通过Key值可以找到它对应的value值,并且Key值可以是任意数据类型。
集合与数组的区别:
(1)长度区别:集合长度可变,数组长度不可变
- 数组长度是固定的,不能自动增长
- 集合是长度可变的,根据元素的多少来决定长度
(2)内容区别:集合可存储不同类型元素,数组存储只可单一类型元素
- 数组在创建的时候 就会定义存储的数据类型 也就是只能存储一种数据类型
- 集合指定泛型只能存储引用数据类型(对象)
- 集合中也可以存储基本数据类型(装箱)最终存储的还是Object类型
- 如果没有泛型限定 默认存储的都是 Object类型的数据 也就是任意类型
(3)元素区别:集合只能存储引用类型元素,数组可存储引用类型也可存储基本类型
- 数组可以存储基本数据类型和引用数据类型
- 数组基本数据类型存的是值;引用数据类型存的是地址
- 集合中保存的都是引用类型,如果是基本数据类型的话会自动转成其包装类.
集合的分类
集合按照储存结构又分为两大类,即单例集合(Collection)和双例集合(Map)。
1.单例集合(Collection)
Collection:单例集合类的根接口,用于储存一系列符合某种规则的元素,
被List接口和Set接口所继承。
List接口有三个实现类:ArrayList、LinkedList、Vector;
Set接口有三个实现类:HasSet、TreeSet、LinkedHashSet;
2.双例集合(Map)
Map:双例集合类的根接口,用于储存具有键(key),值(Value)映射关系的元素。
Map接口有两个实现类:HashMap、LinkedHashMap;
集合的特点
什么是哈希算法?
哈希算法(也叫散列),就是把任意长度值(key)通过散列算法变换成固定长度的key(地址), 通过这个地址进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。
List接口:存储数据有序,有索引,可添加重复数据
ArrayList:Collection接口主要实现类
数据结构:数组
特点:查询快,增删慢,线程不安全,效率高
(默认长度是10 超过就会new一个新的数组 50%延长 节省空间)底层分析:数组结构是有序的元素序列,在内存中开辟一段连续的空间,在空间中存放元素,每个空间都有编号,通过编号可以快速找到相应元素,因此查询快数组初始化时长度是固定的,要想增删元素,必须创建一个新数组,把源数组的元素复制进来,随后源数组销毁,耗时长,因此增删慢。
LinkedList:
数据结构:数组+链表
特点:查询慢,增删快,线程不安全,效率高
(数据结构是链表,双向链表)底层分析:链表分为单向和双向,就是一条链子和两条链子的区别;多出的那条链子记录了元素的顺序,因此单向链表结构无序,双向链表结构有序;链表结构没有索引,因此查询慢;链表的增删只需在原有的基础上连上链子或切断链子,因此增快。
Vector:基本已经不用啦
数据结构:数组;
特点:查询快,增删慢,线程安全,效率低
(默认长度是10 超过就会100%延长 变成20 浪费空间)底层分析:和ArrayList一样,都是数组实现,因此具有相似的特性,它们之间的区别在于Vector是线程安全的,效率低,ArrayList是线程不安全的,但效率高。
Set接口:存储数据无序,无索引,不能添加重复数据
HashSet:
数据结构:jdk1.8之前:数组+链表
jdk1.8之后:数组+链表+红黑树
(当存储数据等于集合长度一半时,使用红黑树。)特点:查询快,(元素无序,元素不重复,无索引)
底层分析:和HashSet相似;
LinkedHashSet:
数据结构:jdk1.8之前:数组+链表
jdk1.8之后:数组+链表+红黑树
(当存储数据等于集合长度一半时,使用红黑树。)特点:查询快,(元素无序,元素不重复,无索引)
底层分析:和LinkedList相似;
TreeSet:
数据结构:红黑树
特点:查询快,可以使用自然排序和比较器排序。(元素有序,元素不重复,无索引)
底层分析:TreeSet实现了继承于Set接口的SortedSet接口 ,它支持两种排序方法,自然排序和定制排序,自然排序的意思就是放入元素“a”,“b”,a会自然地排在b前面,其中还有几个特有方法。
Map接口:双列集合,元素无序,拥有键值对key值和value值
HashMap:
数据结构:jdk1.8之前:数组+链表
jdk1.8之后:数组+链表+红黑树
(当存储数据等于集合长度一半时,使用红黑树。)
特点:查询快,元素无序,
(key不允许重复但可以为null,value可以重复)底层分析:底层是哈希表;
LinkedHashMap:
数据结构:jdk1.8之前:数组+链表
jdk1.8之后:数组+链表+红黑树
(当存储数据等于集合长度一半时,使用红黑树。)
特点:查询快,元素有序,
(key不允许重复但可以为null,value可以重复,但可以按照添加的顺序进行排序)
底层分析:LinkedHashMap就是在HashMap的基础上,在Entry<key,value>对象中添加了before和after两个指针,构成一个双向链表(最少使用的在head,最多使用的在tail),用来存储元素的访问顺序(get和put都算访问),这个双向链表的重要操作就是,当访问了一个元素,那么把他从双向链表中删除,并把它放进双向链表的表头。