首先:Java是面向对象的语言,我们在编程的时候自然需要存储对象的容器,数组可以满足这个需求,但是数组初始化时长度是固定的,但是我们往往需要一个长度可变化的容器,这个就是集合。
1:集合与数组的区别
(1)长度区别:集合长度可变,数组长度不可变
(2)内容区别:集合可存储不同类型元素,数组存储只可单一类型元素
(3)元素区别:集合只能存储引用类型元素,数组可存储引用类型,也可存储基本类型
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实现类(基本不用)
数据结构:数组;
特点:查询快,增删慢
2.1.2Set接口
特点:元素不可重复;
元素无序,存储及取出时顺序不一致;
没有索引,因此不能使用普通For循环遍历;
Set与Collection 接口中的方法基本一致,没有进行功能上的扩充;
2.1.2.1HashSet实现类
数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:查询快,元素无序,元素不可重复,没有索引;
2.1.2.2LinkedHashSet实现类
数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:查询快,元素有序,元素不可重复,没有索引;
2.1.2.3TreeSet实现类
数据结构:红黑树
特点:查询快,元素有序,元素不可重复,没有索引;
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集合中;
2.2.1HashMap实现类
数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:查询快,元素无序,key不允许重复但可以为null,value可以重复。
2.2.2LinkedHashMap实现类
数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:查询快,元素有序,key不允许重复但可以为null,value可以重复。
2.2.3TreeMap实现类
数据结构:红黑树
特点:查询快,元素有序,key不允许重复并且不可以为null,value可以重复。