一,概念
集合是一种容器
特点:
- 集合的长度是可变的
- 同一个集合中可以存储不同数据类型的值
- 可以通过泛型来明确集合中存储的数据类型,一旦指定了泛型,那么该集合就只能存储这种数据类型了
- 集合找那个只能存储引用数据类型,不能存储基本数据类型,如果要在集合中存储基本数据类型,要使用基本数据类型的包装类
二,集合的体系
Collection:集合的顶层父接口,提供了集合的基本操作
List:接口,有序可重复
ArrayList:数组结构
LinkedList:链表结构
Set:接口,不可重复
HashSet:哈希表
TreeSet:树形结构
LinkedHashSet:链表+哈希表
三,List集合
概念:List 集合是Collection 接口的一个子接口
特点:
- 允许重复元素
- 有序的集合
3.1 ArrayList 集合
概念:ArrayList 集合是 List 接口的一个数组结构的实现类。有序可重复。
构造函数:
- new ArrayList():构造一个初始容量为 10 的空列表
- new ArrayList(int capacity):构造一个具有指定初始容量的空列表
- new ArrayList(Collection<? extends E> c):根据参数集合构造一个新集合,参数集合的泛型必须是当前所创建集合泛型的类型或它的子类(设置泛型的上限)
常用方法:
- add(E e):将元素添加到集合的末尾,返回布尔值;如果是 List 的 add() 返回值一定是 true,如果是 Set 的add() ,当元素已存在时会返回 false
- add(int index, E e):将元素添加集合中的指定位置,返回 void
- remove(E e):从集合中移除指定对象,返回是否移除成功的布尔值
- remove(int index):从集合中移除指定位置上的对象,返回被移除的对象
- set(int index, E e):用指定元素替换集合中指定位置上的元素
- get(int index):通过下标返回元素
- size():返回集合的大小
- addAll(Collecrtion c)
- addAll(int index, Collection c)
- containsAll(Collection c):判断参数集合中的所有元素是否都存在于调用者集合中
- a . retainAll( b ):将 a、b两个集合的交集替换掉 a 集合中的所有元素,返回 true 表示 a 集合发生了改变
- a . removeAll( b ):从 a 集合中移除 a、b 集合的交集,返回 true 表示 a 集合发生了改变
- clear()
- contains(E e)
- indexOf(Object o)
- lastIndexOf(Object o)
- isEmpty()
3.2 LinkedList 集合
概念:LinkedList 集合是 List 接口的一个实现类,它的存储结构是链表结构,LinkedList 的特点是增删快,查询慢。
注:在 ArrayList 中所具备的方法,在 LinkedList 中都有,如果想要调用 LinkedList 中的特有方法,不可以使用多态的形式创建 LinkedList 对象。
LinkedList 的特有方法:
- addFirst(E e)
- addLast(E e)
- remove()
- removeFirst()
- removeLast()
- peek()
- peekFirst()
- peekLast()
- pop()
- poll()
- push(E e)
四,Set 集合
概念:Set 集合是Collection 接口的一个子接口
特点:
- 不允许重复元素
- 没有下标,没有使用下标作为参数的相关方法,因此 Set 集合不能使用普通for循环遍历
4.1 HashSet 集合
概念:HashSet 集合 Set 接口的一个实现类
特点:
- 无序,存取顺序不保证一致
- 不允许有重复元素
- 没有下标,没有使用下标作为参数的相关方法,因此 Set 集合不能使用普通for循环遍历
- 底层的数据结构是哈希表,哈希表的特点是查询快
- java8之前,哈希表 = 数组 + 链表
- java8及之后,哈希表 = 数组 + 链表(当链表的长度超过8个时,链表会转换成红黑树)
存储原理:
向HashSet存储数据时,会判断集合中是否已经存在与要存储的数据具有相同哈希值的元素,如果没有,则直接存储。如果有,则会使用equals来比较,如果结果为true,则不存储,结果为false,则存储。
构造函数:
- new HashSet():构造一个初始容量为 16 的空列表
- new HashSet(int capacity):构造一个具有指定初始容量的空列表
- new HashSet(Collection<? extends E> c):根据参数集合构造一个新集合,参数集合的泛型必须是当前所创建集合泛型的类型或它的子类(设置泛型的上限)
4.2 TreeSet 集合
概念:TreeSet 是 Set 接口的一个实现类
特点:
- 无序,存取顺序不保证一致
- 不允许有重复元素
- 没有下标,没有使用下标作为参数的相关方法,因此 Set 集合不能使用普通for循环遍历
- 能实现自动排序
注:
如果TreeSet中存储的是自定义数据类型,那么该类必须实现Comparable接口,否则会发生 ClassCastException
如果自定义的排序方式中属性的差值为0,那么在TreeSet中会视为是同一个对象,由于Set不能存储重复元素,因此只会存储一个。
解决办法:
- 多条件的排序,第一个条件相同时,对第二个条件进行排序
- 使用允许存储重复元素的List集合,实现 Comparable 接口,重写 compareTo() 方法,使用 Collections 的sort() 方法进行排序
构造函数:
new TreeSet():构造一个新的空 set,该 set 根据其元素的自然顺序进行排序
new TreeSet(Comparator c):构造一个新的空 TreeSet,它根据指定比较器进行排序
1
2
3
4
5 TreeSet<Doctor> ds = new TreeSet<Doctor>(new Comparator<Doctor>(){
public int compare(Doctor d1,Doctor d2){
return d2.num - d1.num;
}
});new TreeSet(Collection<? extends E> c):根据参数集合构造一个新集合,参数集合的泛型必须是当前所创建集合泛型的类型或它的子类(设置泛型的上限)
4.3 LinkedHashSet 集合
概念:LinkedHashSet 是 Set 接口的一个实现类
特点:
LinkedHashSet 的数据结构是哈希表加上链表,它在 HashSet 的基础上添加了一条链表来保存元素的存储顺序,因此 LinkedHashSet 的有序的
有序,保证存取顺序一致
没有下标,没有使用下标作为参数的相关方法,因此 Set 集合不能使用普通for循环遍历
构造函数:
- new LinkedHashSet():构造一个初始容量为 16 的空列表
- new LinkedHashSet(int capacity):构造一个具有指定初始容量的空列表
- new LinkedHashSet(Collection<? extends E> c):根据参数集合构造一个新集合,参数集合的泛型必须是当前所创建集合泛型的类型或它的子类(设置泛型的上限)
五,迭代器
概念:迭代器是遍历集合元素的通用方法
原理:先判断是否有下一个可以迭代的元素,如果没有,则不获取,迭代结束;如果有,则获取下一次元素。继续判断。
可迭代的接口:Iterable,提供了 iterator() 方法用于获取迭代器对象
迭代器接口:Iterator,提供了两个方法:
- hasNext():判断集合中是否存在下一个可获取的元素,返回布尔值
- next():获取下一个元素
1
2
3
4
5
6
7 ArrayList<String> list = new ArrayList<String>();
list.add("贾宝玉");
list.add("林黛玉");
list.add("薛宝钗");
for(Iterator<String> it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
六,Collecctions
概念:Collecctions 由在 集合 上进行操作或返回 集合 的静态方法组成。
常用方法:
addAll(Collection<? super T> c ,T … e):将可变参数 e 中的所有元素添加到集合 c 中
binarySearch(List l,T t):使用二分搜索法查询集合中指定元素的下标,
前提是:1.升序排列 2.没有重复元素
binarySearch(List l,T t,Comparator c)
copy(List a,List b):将 b 集合中的所有元素赋值到 a 集合从第一个元素开始,如果 a 的长度小于 b 的长度会发生 IndexOutOfBoundsException
fill(List l,T … t):使用 t 替换 集合中的所有元素
max(Collection c):获取集合中最大值
min(Collection c):获取集合中最小值
如果要获取自定义类型中对象属性的最大最小值,可以使用重载形式:
max(Collection c,Comparator c)、min(Collection c,Comparator c)
replaceAll(List l,T oldValue,T newValue):使用 newValue 替换 list 中的所有 oldValue
*reverse():倒置
*swap(List l,int i,int j):将集合中下标 i 和下标 j 位置上的元素交换
*shuffle(List l):打乱集合
*sort(List l):字符串和基本类型默认按照字典顺序排序,自定义数据类型的属性排序时需要实现 Comparable 接口
*sort(List l,Comparator c):字符串和基本类型默认按照字典顺序排序,自定义数据类型的属性排序时,需要传入 Comparator 的实现类对象。
七,Map
7.1 概念和特点
Collection 单列集合
Map 是双列集合,在 Map 中存储元素时,要将一个元素以键值对的一一对应的映射关系存储到集合中
Map的特点:
- Map 中的一个元素包含两个部分:键(key)、值(value)
- key 和 value 的类型的任意的
- key 是唯一的,value 是可以重复
- Map 中存储的是映射关系,该映射关系由键和对应的值产生
- Map 没有下标
7.2 Map 的方法
- put(k,v):将 k、v形成的键值对添加到集合中,当 key 重复时,返回被替换的 value
- remove(k):将键所对应的键值对删除,返回被删除的值
- remove(k,v):只有当k、v的映射关系存在集合于中才会删除
- replace(k,v):将 v 替换指定 k 上的值
- replace(key,oldValue,newValue):只有当 key 和 oldValue 的映射关系存在集合于中才会将 newValue 替换掉 oldValue
- get(k):根据键返回对应的值
- size():返回集合的大小
- clear():清空集合
- containsValue(v):判断是否存在指定的值
- containsKey(k):判断是否存在指定的键
- isEmpty():判断集合是否为空
- equals(map):比较两个 Map 中的元素是否完全相同
- values():返回 Map 中值组成 Collection 集合
- keySet():获取 Map 中所有键组成的 Set 集合
- entrySet():获取 Map 中所有映射关系组成的 Set 集合
z