Java13 集合知识点
一、集合概念
1. 定义:集合是一种工具/容器,用于存储数量不等的多个对象。
2. 位置:集合相关的接口和类位于java.util包中。
3. 学习要点:
◦ 集合接口的特点
◦ 集合接口中功能方法
◦ 集合接口对应的实现类
◦ 集合的遍历方式
二、Collection集合体系
1. 父接口:Collection接口
• 特点:存储任意类型Object对象。
• 核心方法:
方法声明 功能说明
boolean add(Object o) 将o对象添加到集合中【开发重点】
boolean contains(Object o) 判断集合中是否包含o元素,包含返回true,否则false
boolean remove(Object o) 将o对象从当前集合中移除、删除
int size() 获取集合中有效元素的个数
• 实现类:无直接实现类,详见子接口。
• 遍历:详见子接口。
2. 子接口:List接口
• 特点:存储任意类型Object对象,有序、有下标、元素允许重复【基础重点】
◦ 下标范围:0 ~ size()-1(有效元素个数-1)
• 核心方法(继承Collection,新增以下方法):
方法声明 功能说明
boolean add(Object o) 将元素存储到List集合,默认存储在集合的尾部【重点】
add(int index, Object o) 将指定的元素插入到集合对应的下标位置
Object get(int index) 返回指定下标对应集合元素
Object remove(int index) 删除指定下标对应的元素,返回值代表被删除的对象
Object set(int index, Object o) 修改指定下标对应元素为o对象,返回被修改之前的元素
• 实现类对比:
实现类 底层结构 特点 线程安全 效率
ArrayList 数组 查询效率高,增删效率低 不安全 高(JDK2.0)
Vector 数组 查询效率高,增删效率低 安全(JDK1.0) 低
LinkedList 链表 查询效率低,增删效率高 不安全 高
面试题:ArrayList和LinkedList的区别?
答:底层结构不同,ArrayList基于数组实现,查询快、增删慢;LinkedList基于链表实现,查询慢、增删快;二者均为线程不安全,ArrayList在随机访问场景更优,LinkedList在频繁增删场景更优。
• 遍历方式:
1. 下标遍历:通过下标i + get()方法访问元素
for(int i=0;i<集合名.size();i++){
Object element = 集合名.get(i);
}
2. forEach遍历【开发应用重点】
for(数据类型 变量名 : 要遍历的集合名){
// 直接操作变量名即可
}
3. 迭代器遍历(forEach底层原理)
Iterator it = 集合名.iterator();
while(it.hasNext()){
Object element = it.next();
}
◦ 核心方法:hasNext()(判断是否有下一个元素)、next()(获取下一个元素)
3. 泛型
• 泛型集合:安全的集合,强制约束集合的元素类型一致【重点】
List<数据类型> 集合名 = new ArrayList<数据类型>();
• 泛型类:
◦ 语法:class 类名<泛型标识1,泛型标识2>{ // 将泛型标识作为数据类型应用 }
◦ 常用标识:K/V/E/T
◦ 应用:创建对象时需指定泛型数据类型,前后类型需一致
◦ 注意:基本数据类型不能作为泛型,需使用对应包装类;未指定时默认Object类型;多个泛型标识需全部指定或全部不指定。
4. 集合工具类:Collections
• 定义:用于操作集合元素的工具类,提供大量静态方法(排序、倒置、随机等)
• 常用方法:
方法声明 功能说明
static void reverse(List list) 将集合中元素进行倒置
static void shuffle(List list) 对集合中元素进行随机打乱
static void sort(List list) 对集合中元素进行排序
• 排序规则:
1. 内置比较器(java.lang.Comparable接口):
◦ 需实现compareTo(T t)方法,定义排序规则(当前对象this与t比较)
◦ 示例代码:
public class Student implements Comparable<Student>{
private String name;
private Integer age;
private Double score;
// 构造方法、getter/setter、toString()
@Override
public int compareTo(Student o) {
// 先按年龄升序,再按成绩降序,最后按姓名升序
if(this.age > o.age) return 1;
else if(this.age < o.age) return -1;
else {
if(this.score > o.score) return -1;
else if(this.score < o.score) return 1;
else return this.name.compareTo(o.name);
}
}
}
2. 外置比较器(java.util.Comparator接口):
◦ 无需修改实体类,通过匿名内部类实现compare(T o1, T o2)方法
◦ 示例代码:
Collections.sort(list, new Comparator<Worker>(){
@Override
public int compare(Worker w1, Worker w2) {
// 按年龄升序
if(w1.getAge() > w2.getAge()) return 1;
else if(w1.getAge() < w2.getAge()) return -1;
else return 0;
}
});
• 面试题:Collection和Collections的区别?
◦ Collection:是Java集合体系的父接口,包含List、Set等子接口,定义了集合的通用方法。
◦ Collections:是操作集合的工具类,提供大量静态方法(排序、倒置等)。
5. 子接口:Set接口
• 特点:存储多个任意类型的对象,无序、无下标、元素不允许重复
• 方法:继承Collection接口中的方法
• 实现类:HashSet【开发+面试重点】
◦ 自定义对象存储去重原理:需重写hashCode()和equals()方法
1. hashCode():保证相同内容的对象返回相同哈希码,不同内容尽量返回不同哈希码(通常拼接所有属性的哈希值)
2. equals():保证相同内容的对象返回true,拒绝重复添加
◦ 去重流程:存储时先调用hashCode()获取哈希值,若对应位置无元素则直接存储;若有元素则调用equals()比较内容,相同则拒绝添加,不同则添加。
• 其他Set实现类:
◦ SortedSet:Set的子接口,可对元素排序,实现类TreeSet(需实现Comparable接口)
◦ LinkedHashSet:HashSet的子类,按添加顺序存储元素,同时保证不重复(需重写hashCode()和equals())
三、Map集合体系
1. Map集合的特点【基础重点】
• 存储任意的键值对(key-value),一个集合元素是一个键值对
• 键:无序、无下标、不允许重复(唯一)
• 值:无序、无下标、允许重复
2. Map集合中的方法
方法声明 功能说明
V put(K key,V value) 添加键值对,键不存在则直接添加并返回null;键存在则覆盖旧值,返回被覆盖的值【开发重点】
V remove(K key) 根据键删除对应的键值对,返回被删除的值
V get(K key) 根据键返回对应的值【重点】
boolean containsKey(K key) 判断是否包含指定键,包含返回true
boolean containsValue(V value) 判断是否包含指定值,包含返回true
int size() 获取Map中键值对的个数
3. 实现类对比
实现类 特点 线程安全 null支持 效率
HashMap 基于哈希表实现,键不重复 不安全(JDK1.2) 允许null作为key/value 高
Hashtable 早期哈希表实现 安全(JDK1.0) 不允许null作为key/value 低
Properties Hashtable子类,键值均为String类型,常用于读取配置文件 - - -
SortedMap Map子接口,可对键自动排序,实现类TreeMap - - -
LinkedHashMap HashMap子类,按添加顺序存储键值对 - - -
面试题:HashMap和Hashtable的区别?
答:HashMap线程不安全、效率高,允许null键值;Hashtable线程安全、效率低,不允许null键值;二者底层均为哈希表实现,HashMap是后续优化版本,更推荐使用。
4. Map集合的遍历方式
1. 键遍历(keySet()):获取所有键,再通过get()获取值【开发应用重点】
Set<K> ks = map.keySet();
for(K key : ks){
V value = map.get(key);
}
2. 值遍历(values()):仅获取所有值
Collection<V> vs = map.values();
for(V value : vs){
// 直接操作value
}
3. 键值对遍历(entrySet()):获取所有键值对(Map.Entry)
Set<Map.Entry<K,V>> kvs = map.entrySet();
for(Map.Entry<K,V> kv : kvs){
K key = kv.getKey();
V value = kv.getValue();
}
集合体系结构图
Collection体系
Interface Collection
├─ Interface List
│ ├─ Class ArrayList
│ ├─ Class LinkedList
│ └─ Class Vector
└─ Interface Set
├─ Class HashSet
└─ Interface SortedSet
└─ Class TreeSet
Map体系
Interface Map
├─ Class HashMap
└─ Interface SortedMap
└─ Class TreeMap
