Java 集合|Collection、List、ArrayList、LinkedList、泛型、Collections 工具类

一、集合概念

  1. 集合是容器工具,用于存储数量不等的多个对象。
  2. 集合相关接口、类全部位于 java.util 包下。
  3. 学习集合四个核心角度:
    1. 集合接口的特点
    2. 集合接口的功能方法
    3. 集合接口对应的实现类
    4. 集合的遍历方式

二、Collection 集合体系

2.1 Collection 父接口

  • 特点:可以存储任意Object类型对象。
  • 常用方法:

表格

方法 说明
boolean add(Object o) 向集合添加对象
boolean contains(Object o) 判断集合是否包含该元素,返回 true/false
boolean remove(Object o) 移除集合中的指定对象
int size() 获取集合有效元素个数

Collection 没有直接实现类,功能由子接口实现。

2.2 List 子接口

  • 特点:存储 Object 对象,有序、带下标、允许元素重复
  • 下标范围:0 ~ size()-1

List 继承 Collection 全部方法,额外扩展方法:

表格

方法 说明
add(int index,Object o) 在指定下标位置插入元素
Object get(int index) 根据下标获取元素
Object remove(int index) 根据下标删除元素,返回被删除对象
Object set(int index,Object o) 修改指定下标元素,返回修改前旧元素
List subList(int fromIndex,int toIndex) 截取集合,左包含、右不包含 [fromIndex, toIndex‑1]

2.3 List 实现类

1. ArrayList
  • 底层:数组实现
  • JDK7:创建对象不会初始化底层数组;第一次执行add()才初始化数组,初始容量默认10;扩容按照1.5 倍扩容。
  • 特性:查询效率高;中间插入、删除元素效率低;线程不安全,执行效率高。
  • 适用场景:大量做末尾添加、查询操作。
2. Vector
  • 底层:数组实现
  • JDK1.0;线程安全,效率较低;查询快,中间增删慢。
3. LinkedList
  • 底层:双向链表实现
  • 查询遍历效率低;中间位置增删元素效率高;线程不安全,效率高。

✨面试题:ArrayList 和 LinkedList 的区别

  1. ArrayList 底层数组;查询快,中间插入删除慢;1.5 倍扩容;线程不安全。
  2. LinkedList 底层双向链表;查询慢;中间增删效率高;没有扩容机制;线程不安全。

2.4 List 集合三种遍历方式

① 下标 for 遍历
复制代码
for(int i = 0 ; i < list.size() ; i++){
    Object obj = list.get(i);
}
② for‑each 增强 for 循环(开发常用)

for‑each 底层本质是迭代器

复制代码
for(Object obj : list){
    //操作obj
}
③ Iterator 迭代器遍历
复制代码
//获取迭代器对象
Iterator<String> it = list.iterator();
while(it.hasNext()){
    //hasNext() 判断游标右侧是否还有元素
    String str = it.next();
    //next()取出下一个元素,无元素会抛出 NoSuchElementException
    System.out.println(str);
}

注意:迭代器游标初始位于所有元素最左侧;调用next()之前必须先用hasNext()判断。

2.5 泛型

1)泛型集合

作用:约束集合存储类型,保证数据类型安全,集合元素类型统一。

复制代码
//完整写法
List<String> list = new ArrayList<String>();
//JDK7之后菱形语法简写
List<String> list = new ArrayList<>();

泛型只能写引用类型;如果需要基本类型,使用对应的包装类。不指定泛型,默认泛型为Object。

2)自定义泛型类

泛型标识一般使用单个大写字母:T、K、V、E

复制代码
//定义泛型类
class Demo<T>{
    //T就当作一种数据类型使用
    private T data;
}

//创建对象时指定泛型真实类型
Demo<String> demo = new Demo<>();
  • JDK5 之后泛型也可以定义在接口上。
  • 使用泛型让代码更加通用灵活,多用于通用工具类、底层框架开发。

2.6 Collections 工具类

java.util.Collections,集合工具类,全部为静态方法,直接类名调用。

表格

静态方法 说明
Collections.reverse(List list) 集合元素反转
Collections.shuffle(List list) 集合元素随机打乱
Collections.sort(List list) 集合排序

排序注意点:

  1. 如果集合存放自定义对象,实体类需要实现Comparable接口,重写compareTo()方法定义排序规则 ------ 内置比较器。
  2. List 自带sort(Comparator c)方法,可以传入Comparator接口(匿名内部类 / Lambda)实现排序 ------ 外置比较器。

✨面试题:集合实现排序

  1. 使用Collections.sort(list);
  2. 集合存放自定义实体类:
    • 方式一:实体实现Comparable重写compareTo内置比较器;
    • 方式二:调用 list.sort (Comparator) 传入外置比较器(匿名内部类 / Lambda)。
相关推荐
IT枫斗者枫哥13 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟13 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
BBmmo13 小时前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕13 小时前
Hutool之RandomUtil:随机数生成的终极利器
java·后端
花开路口13 小时前
深入理解 Java/Kotlin 协变与逆变
java·kotlin
运行时异常13 小时前
【WMS 仓储系统集成 AI Agent 实战】第 7 讲:Vue3 前端工程化——Token 刷新锁、Markdown 渲染踩坑与权限体系
java
她的男孩13 小时前
开放接口限流从 20 改到 200 还是每分钟 20 次:拆完防重放+幂等+限流,我找到 5 个静默失效的坑
java·后端·架构
天天被压力13 小时前
【Python 量化取数指南 #13】Python 把行情落库:sqlite 一键存,回测随用随取
java·人工智能·python
天天被压力13 小时前
【Python 量化取数指南 #14】Python 清洗行情数据:复权停牌对齐,回测不翻车
java·人工智能·python
独泪了无痕13 小时前
开发利器Hutool之MapUtil的使用
java·后端