1.集合介绍
1.1与数组的区别
(1)长度区别:集合长度可变,数组长度不可变
(2)内容区别:集合可存储不同类型元素,数组存储只可单一类型元素
(3)元素区别:集合只能存储引用类型元素,数组可存储引用类型,也可存储基本类型
1.2集合的类别
Java集合要从两大接口说起,一为Collection接口,二为Map接口,它们是同一个层次的。
Collection接口被List接口和Set接口继承;
-
List接口有三个实现类,ArrayList,LinkedList,Vector;
-
Set接口被HashSet类实现,被SortedSet接口继承,同时TreeSet类实现SortedSet接口,LinkedHashSet类继承HashSet类;
-
Map接口有两个实现类,HashMap,HashTable,同时Propertise类继承HashTable;
-
Map接口被SortedMap接口继承,同时TreeMap类实现了SortedMap接口;
2、集合详述
2.1Collection接口(单列集合)
Collection接口是单列集合的最顶层接口,定义了一些通用的方法。
- add(E e)添加元素; clear()清空元素; remove(E e)移除元素; size()元素数量;
- toArray()集合转数组; contains(E e)判断元素是否存在; isEmpty()判断集合是否为空;
2.1.1List 接口
特点:
- 有索引,精准操作元素;
- 元素有序,存储及取出时顺序一致;
- 元素可重复,通过.equals()比较是否重复。
它利用索引(index),定义了一些特殊方法:
- get(int index,E e) 获取指定位置的元素;
- remove(int index)移除指定位置的元素;
- add(int index,E e) 将元素添加到指定位置;
- set(int index,E e) 用元素替换指定位置的元素;
2.1.1.1ArrayList实现类
数据结构:数组;
特点:查询快,增删慢,主要用于查询遍历数据,为最常用集合之一;
底层分析:数组结构是有序的元素序列,在内存中开辟一段连续的空间,在空间中存放元素,每个空间都有编号,通过编号可以快速找到相应元素,因此查询快;数组初始化时长度是固定的,要想增删元素,必须创建一个新数组,把源数组的元素复制进来,随后源数组销毁,耗时长,因此增删慢。
2.1.1.2LinkedList实现类
数据结构:双向链表;
特点:查询慢,增删快;
底层分析:链表分为单向和双向,就是一条链子和两条链子的区别;多出的那条链子记录了元素的顺序,因此单向链表结构无序,双向链表结构有序;链表结构没有索引,因此查询慢;链表的增删只需在原有的基础上连上链子或切断链子,因此增删快。
特有方法:
- getFirst() 返回开头元素;
- getLast() 返回结尾元素;
- pop() 从所在堆栈中获取一个元素;
- push(E e) 将元素推入所在堆栈;
- addFirst(E e) 添加元素到开头,头插;
- addLast(E e) 添加元素到结尾,尾插;
2.1.1.3Vector实现类
数据结构:数组;
特点:查询快,增删慢
底层分析:和ArrayList一样,都是数组实现,因此具有相似的特性,它们之间的区别在于Vector是线程安全的,效率低,ArrayList是线程不安全的,但效率高。
2.1.2Set接口
特点:
- 元素不可重复;
- 元素无序,存储及取出时顺序不一致;
- 没有索引,因此不能使用普通For循环遍历;
Set与Collection 接口中的方法基本一致,没有进行功能上的扩充;
2.1.2.1HashSet实现类
数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:
查询快,元素无序,元素不可重复,没有索引;
底层分析:哈希表底层用数组+单向链表实现,即使用链表处理冲突,同一Hash值的元素都存储在一个链表里,但是当位于一个链表中的元素较多,即Hash值相等的元素较多,通过key值依次查找的效率降低。JDK1.8之后,哈希表底层采用数据+单向链表+红黑树实现,当链表长度超过阈值(8)时,链表将转换为红黑树,极大缩短查询时间。
2.1.2.2LinkedHashSet实现类
数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:
查询快,元素有序,元素不可重复,没有索引;
底层分析:
作为HashSet的子类,只是比它多了一条链表,这条链表用来记录元素顺序,因此LinkedHashSet其中的元素有序。
2.1.2.3TreeSet实现类
数据结构:红黑树
特点:
查询快,元素有序,元素不可重复,没有索引;
底层分析:
TreeSet实现了继承于Set接口的SortedSet接口 ,它支持两种排序方法,自然排序和定制排序,自然排序的意思就是放入元素“a”,“b”,a会自然地排在b前面,其中还有几个
特有方法:
- first() 返回第一个元素;
- last() 返回最后一个元素;
- comparator() 返回排序比较器;
2.2Map接口(双列集合)
特点:
元素包含两个值(key,value)即键值对, key不允许重复,value可以重复, key与value是一一对应的。元素无序;
Map接口是双列集合的最顶层接口,定义了一些通用的方法:
- put(key , value) 添加元素;
- remove(key) 删除key对应元素;
- containsKey(key) 判断是否存在key对应元素;
- get(key) 获取key对应元素;
- KeySet() 获取所有的key,存到Set集合中;
- entrySet() 获取所有的元素,存到Set集合中;
注意:
Map集合必须保证保证key唯一,作为key,必须重写hashCode方法和equals方法,以保证key唯一。
2.2.1HashMap实现类
数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:
查询快,元素无序,key不允许重复但可以为null,value可以重复。
2.2.2LinkedHashMap实现类
数据结构:
JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:
查询快,元素有序,key不允许重复但可以为null,value可以重复。
2.2.3HashTable实现类(基本不用)
数据结构:
哈希表
特点:
查询快,元素无序,key不允许重复并且不可以为null,value可以重复。
底层分析:
HashTable和Vector一样是古老的集合,有遗留缺陷,在JDK1.2之后 被更先进的集合取代了;HashTable是线程安全的,速度慢,HashMap是线程不安全的,速度快;
2.2.3TreeMap实现类
数据结构:红黑树
特点:查询快,元素有序,key不允许重复并且不可以为null,value可以重复。