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)。
相关推荐
猿究院_夏燊7 小时前
Spring Bean 生命周期
java·后端·spring
Wang's Blog7 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
inrichtt7 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
信誓旦旦的程序猿8 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河8 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
Jlzn88888 小时前
华东电芯分选通道数怎么配才不堵线
java·人工智能·架构·自动化·制造
HPtiger8 小时前
数据结构——选择排序
数据结构·算法·排序算法
香吧香8 小时前
GRPC连接机制---长连接分析
java·网络与传输协议
我是人✓8 小时前
SpringBoot项目的五种创建方式
java·spring boot·后端
丑梨数据9 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法