目录
一、集合概述
在Java中,集合(Collection)是一种用于存储和操作一组对象的数据结构。它提供了一组接口和类,用于处理和操作对象的集合。
集合框架(Collection Framework)是Java中用于表示和操作集合的一组类和接口。它位于java.util包中,并提供了一系列的接口和类,包括集合接口(Collection)、列表接口(List)、集合类(Set)、映射接口(Map)等。
集合框架的主要目标是提供一种通用的方式来存储和操作对象的集合,无论集合的具体实现方式如何,用户都可以使用统一的接口和方法来操作集合。
Java集合框架(Collection Framework)是Java中用于表示和操作集合的一组类和接口,位于java.util
包中。与数组相比,集合具有以下优势:
- 数组的长度是固定的,集合的长度是可变的
- 数组中存储的是同一类型的元素,集合中存储的数据可以是不同类型的
- 数组中可以存放基本类型数据或者引用类型变量,集合中只能存放引用类型变量
- 数组是由JVM中现有的 类型+[] 组合而成的,除了一个length属性,还有从Object中继承过来的方法之外,数组对象就调用不到其他属性和方法了
- 集合框架由java.util包下多个接口和实现类组成,定义并实现了很多方法,功能强大
二、Collection接口
Collection接口是单列集合类的父接口,这种集合可以将数据一个一个的存放到集合中。它有两个重要的子接口,分别是java.util.List和java.util.Set
1. 核心方法
boolean add(E e) // 添加元素 void clear() // 清空集合 boolean contains(Object o) // 判断包含 boolean isEmpty() // 判断空集合 boolean remove(Object o) // 删除元素 int size() // 元素个数 Object[] toArray() // 转为数组 Iterator<E> iterator() // 获取迭代器
2. 遍历方式
三种遍历方法:
-
toArray()转换法
借助Collection接口中toArray()方法实现,方法原型为:Object[] toArray();
Object[] array = coll.toArray(); for(int i=0; i<array.length; i++){ System.out.println(array[i]); }
-
迭代器遍历
迭代器是集合框架提供的一种遍历集合元素的方式。通过调用集合的iterator()方法可以获取一个迭代器对象,然后使用迭代器的hasNext()方法判断是否还有下一个元素,使用next()方法获取下一个元素。
Iterator<String> it = coll.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); }
迭代器实现原理:
3.增强for循环
- 获取迭代器对象:集合类实现了Iterable接口,该接口定义了一个iterator()方法,用于获取迭代器对象。迭代器对象是实现了Iterator接口的具体类的实例。
- 迭代器位置初始化:在创建迭代器对象时,迭代器的位置通常初始化为集合的起始位置。不同的集合实现可能对位置初始化进行不同的处理。
- 遍历集合元素:通过调用迭代器对象的hasNext()方法,可以判断集合中是否还有下一个元素如果有下一个元素,可以通过next()方法获取下一个元素,并将迭代器的位置后移。
- 迭代器状态管理:迭代器对象会记录当前迭代的状态,包括当前位置、遍历过程中的操作等。这些状态可以帮助迭代器在遍历过程中正确地访问和操作集合的元素。
- 结束迭代:当集合中没有更多元素时,迭代器的hasNext()方法将返回false,表示遍历结束。
public static void main(String[] args) {
int[] arr = {1,3,5,7,9};
//每次循环,使用变量i接收数组中的一个数据
for(int i : arr){
System.out.println(i)
三、List接口
java.util.List 接口继承了Collection 接口,是常用的一种集合类型。List集合具有Collection集合的特点之外,还具有自己的一些特点:
- List是一种有序集合
例如,向集合中存储的元素顺序是8、2、5。那么集合中就是按照这个顺序进行存储的
- List一种带索引的集合
可以通过元素的下标索引,精确查找对应的元素数据
- List集合可以存放重复元素
可以把相同的数据,在List集合中多次保存
1. 特点
-
有序集合(插入顺序)
-
可重复元素
-
带索引访问
2. 常用实现类
实现类 | 数据结构 | 特点 | 适用场景 |
---|---|---|---|
ArrayList | 动态数组 | 查询快,增删慢 | 频繁查询 |
LinkedList | 双向链表 | 增删快,查询慢 | 频繁增删 |
Vector | 动态数组 | 线程安全,效率低 | 多线程环境(已淘汰) |
3. 常用方法
//返回集合中指定位置的元素。
E get(int index);
//用指定元素替换集合中指定位置的元素,并返回被替代的旧元素。
E set(int index, E element);
//将指定的元素,添加到该集合中的指定位置上。
void add(int index, E element);
//从指定位置开始,把另一个集合的所有元素添加进来
boolean addAll(int index, Collection<? extends E> c);
//移除列表中指定位置的元素, 并返回被移除的元素。
E remove(int index);
//查收指定元素在集合中的所有,从前往后查到的第一个元素(List集合可以重
复存放数据)
int indexOf(Object o);
//查收指定元素在集合中的所有,从后往前查到的第一个元素(List集合可以重
复存放数据)
int lastIndexOf(Object o);
//根据指定开始和结束位置,截取出集合中的一部分数据
List<E> subList(int fromIndex, int toIndex);
四、Set接口
java.util.Set 接口继承了Collection 接口,是常用的一种集合类型。相对于之前学习的List集合,Set集合特点如下:
1. 特点
-
无序集合(除LinkedHashSet)
-
元素唯一
-
无索引
2. 常用实现类
实现类 | 数据结构 | 特点 | 排序方式 |
---|---|---|---|
HashSet | 哈希表 | 无序,最快 | 无 |
LinkedHashSet | 哈希表+链表 | 按插入顺序 | 插入顺序 |
TreeSet | 红黑树 | 自动排序 | 自然/比较器排序 |
3. 排序方式
自然排序:
class Person implements Comparable<Person>{ @Override public int compareTo(Person o){ return this.age - o.age; // 按年龄升序 } }
比较器排序:
Comparator<Person> comp = new Comparator<>(){ @Override public int compare(Person o1, Person o2){ return o2.age - o1.age; // 按年龄降序 } }; TreeSet<Person> set = new TreeSet<>(comp);
五、Map接口
1. 特点
-
键值对存储(key-value)
-
键唯一,值可重复
-
高效查找
2. 常用实现类
实现类 | 数据结构 | 特点 |
---|---|---|
HashMap | 哈希表 | 无序,最快,允许null |
LinkedHashMap | 哈希表+链表 | 按插入顺序 |
TreeMap | 红黑树 | 按键排序 |
Hashtable | 哈希表 | 线程安全,不允许null |
3. 遍历方式
两种遍历方法:
-
keySet()遍历
Set<Integer> keys = map.keySet(); for(Integer key : keys){ String value = map.get(key); System.out.println(key + ": " + value); }
-
entrySet()遍历
Set<Entry<Integer,String>> entries = map.entrySet(); for(Entry<Integer,String> entry : entries){ System.out.println(entry.getKey()+": "+entry.getValue()); }
六、数据结构
1. 数组 vs 链表
特性 | 数组 | 链表 |
---|---|---|
内存 | 连续内存 | 非连续内存 |
访问 | O(1)随机访问 | O(n)顺序访问 |
插入/删除 | O(n)需要移动元素 | O(1)修改指针即可 |
2. 树结构
-
二叉树:每个节点最多两个子节点
-
红黑树:自平衡二叉查找树,保证查找效率
-
节点为红或黑
-
根节点为黑
-
红色节点的子节点必须为黑
-
从任一节点到其叶子的路径包含相同数量黑节点
-
七、Collections工具类
常用方法
Collections.sort(list) // 排序 Collections.reverse(list) // 反转 Collections.shuffle(list) // 随机打乱 Collections.max(collection) // 最大值 Collections.min(collection) // 最小值 Collections.fill(list, obj) // 填充
八、最佳实践
-
选择集合类型:
-
需要排序 → TreeSet/TreeMap
-
需要保持插入顺序 → LinkedHashSet/LinkedHashMap
-
只需要唯一性 → HashSet/HashMap
-
需要索引访问 → ArrayList
-
-
性能优化:
-
预估数据量设置初始容量
-
多线程环境使用
Collections.synchronizedXXX()
包装
-
-
注意事项:
-
存储自定义对象需正确实现
equals()
和hashCode()
-
使用泛型保证类型安全
-
迭代时不要修改集合结构
-
通过深入理解Java集合框架的体系结构和各种实现类的特点,开发者可以根据具体业务场景选择最合适的集合类型,编写出高效、健壮的代码。