集合
功能
集合相当于增强的数组,存储对象,不能存储基本数据类型。
与数组的区别
- 数组和集合都是容器;
- 数组长度固定,集合长度可变;
- 数组中可以存储基本数据类型和引用类型,集合只能存储对象;
- 数组中存储数据类型是单一的,集合中可以存储任意类型的对象。
特点
- 只能用于存储对象;
- 集合长度可变;
- 集合可以存储不同类型的对象
集合类图
Collection接口
三个子接口:List(列表)、Set(集)、Queue(队列)
- List:有序、可重复、有下标
- Set:无序、不重复、无下标
- Queue:队列、先进先出
Collection方法
添加
boolean add(E e) | 确保Collection包含指定元素 |
---|---|
boolean addAll(Collection<? extends E> c) | 将另一个集合元素添加到当前集合 |
删除
boolean remove(Object o) | 从集合中删除o |
---|---|
boolean removeAll(Collection<?> c) | 从集合中删除集合c |
判断
boolean isEmpty() | 判断集合为空 |
---|---|
boolean contains(Object o) | 判断指定o是否在集合里 |
boolean containsAll(Collection<?> c) | 判断指定c是否在集合里 |
获得
int size() | 返回此Collection中的元素数 |
---|---|
Object[] toArray() | 返回包含此集合中所有元素的数组 |
遍历
普通for语句
增强for语句
for(元素类型 循环变量名 :Collection对象){
处理操作
}
迭代器
Iterator 变量名 = Collection对象.iterator();
while(变量名.hasNext()){
System.out.println(变量名.next());
}
List接口
java.util.List
- ArrayList:线程不安全,底层使用数组实现,可变长度,查询速度快,增删慢
- LinkedList:链表结构,底层使用链表实现,可变长度,增删速度快
- Vector:底层使用数组实现,线程安全,但速度慢,已被ArrayList替代
- Stack:先进后出,底层调用Vector类中方法,数组实现
ArrayList
有序,可重复
方法 | 功能 |
---|---|
boolean add(E e) | 尾部添加,索引从0开始 |
boolean add(int index,E e) | 指定位置添加元素 |
E set(int index,E e) | 替换指定位置元素 |
E get(int index) | 返回指定位置元素 |
E remove(int index) | 移除指定位置元素 |
List subList(int start,int tail) | 截取[start,tail) |
int size() | 返回列表长度 |
boolean contains(Object o) | 判断列表是否存在指定元素 |
构造方法
构造方法 | 功能 |
---|---|
ArrayList(){} | 构建一个空列表 |
ArrayList(int init){} | 构建一个初始长度的空列表 |
ArrayList(Collection<? extends E> c) | 构建一个包含指定集合的列表 |
特点:
- 底层实现数组
- 查找快,修改慢
- 无参构造,创建空列表,添加第一个才会初始化
- 快溢出时,扩容操作(默认扩容大小:原数组长度+(原数组长度>>1))
- ArrayList是一个非线程安全的列表
LinkedList
java.util.LinkedList
方法 | 功能 |
---|---|
void addFiest(E e) | 插入头 |
void addLast(E e) | 插入尾 |
E getFirst() | 返回头 |
E getLast) | 返回尾 |
E removeFirst() | 移除并返回头 |
E removeLast() | 移除并返回尾 |
特点
- 有序,可重复
- 双链表,查找慢,添加和删除慢
- LinkedList是非同步的
Set接口
java.util.Set
特点
不包含重复元素的collection
子类
- HashSet:底层调用HashMap中的方法,元素唯一,线程不安全(不同步),存取快
- TreeSet:不重复,按照指定顺序排列,接口实现Comparable,线程不安全(不同步)
- LinkedHashSet:哈希表和链表实现了Set接口,元素唯一、有序不重复
HashSet类
特点
- HashSet:无序不重复,无索引。
- 默认不重复的是虚地址,要想内容不重复,就重写hashcode和equals方法。
- 底层是HashMap实现,HashMap底层是由数组+链表+红黑树实现。
- HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的。它内部元素的顺序是由哈希码来决定的,所以它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。
- 无索引,无法使用for循环来遍历,可以使用增强for循环和迭代器来循环。
- 造成存泄露的原因:HashSet的remove方法也依赖于哈希值进行待删除节点定位,如果由于集合元素内容被修改而导致hashCode方法的返回值发生变更,那么,remove方法就无法定位到原来的对象,导致删除不成功,从而导致内存泄露。
TreeSet类
特点
无序不重复,排序(compareable接口),线程不安全。
Map接口
java.util.Map
Class LinkedHashMap<K,V>
**注意:**Map存储的键(K)是唯一的
Map集合常用类
HashMap:线程不安全,速度快,允许放null键,null值;(无序)
LinkedHashMap:继承自HashMap,链表;(有序)
Hashtable:线程安全,速度慢,不允许放null键,null值;
ConcurrentHashMap:线程安全且高效
TreeMap:对键进行排序(TreeSet)
方法
方法 | 功能 |
---|---|
V put(K key,V value) | 添加 |
void clear() | 清空 |
V remove(Object key) | 移除 |
boolean containsKey(Object key) | |
boolean containsValue(Object value) | |
boolean isEmpty() |
HashMap类
特点:
- 底层实现1.7之前:数组+链表,1.8以后:数组+链表+红黑树
- key不允许重复,若重复,后值覆盖前值
- HashMap是非线程安全的
常用方法
Object put(Object key,Object val)
Object get(Object key)
Object remove(Object key)
Collections工具类
特点:
- 底层实现1.7之前:数组+链表,1.8以后:数组+链表+红黑树
- key不允许重复,若重复,后值覆盖前值
- HashMap是非线程安全的
常用方法
Object put(Object key,Object val)
Object get(Object key)
Object remove(Object key)