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)。
相关推荐
我不会起名字3221 小时前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈
XR1234567881 小时前
医院移动医护零漫游无线网络选型指南
java·后端·struts
干到60岁退休的码农1 小时前
13.构建登录接口响应数据
java·spring boot·mybatis
苦瓜小生2 小时前
【前端】【力扣与手撕】十天带你刷完前端算法与手撕,全是最简单好记的最优解法!day4
前端·数据结构·算法·leetcode·面试
水巷石子2 小时前
学习langChain4j的第二天,体验springBoot中的starter
java·spring boot·学习·spring·langchain4j
ly76892 小时前
Spring Bean生命周期全流程:从BeanDefinition到销毁
java·后端·spring·bean生命周期·beandefinition·初始化回调
君顾12 小时前
智慧场馆解决方案小程序系统实战:从架构设计到上线指南
java·开发语言·智慧场馆
zhougl9962 小时前
Dockerfile实战教程
java·开发语言·spring boot