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)。
相关推荐
D e re k ZH19 分钟前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶1 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
文丑颜不良啊1 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊3 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发3 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力4 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力4 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A4 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵4 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
nice_lcj5205 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist