ArrayList本身不自带排序和查找方法,需借助Collections工具类或Stream API;排序前须确保元素可比较,查找时未排序用contains()或indexOf()(O(n)),已排序可用binarySearch()(O(log n))。

Java 中的 ArrayList 本身不自带排序和查找方法,但可以通过 Collections 工具类或 Stream API 快速实现。关键在于:排序需保证元素可比较(实现 Comparable)或提供 Comparator;查找推荐用 contains() 判断存在性,用 indexOf() 获取位置,或结合排序后使用二分查找提升效率。
排序 ArrayList 的常用方式
未排序的 ArrayList 无法直接二分查找,所以排序往往是查找前的重要步骤。
-
对基本类型包装类或 String 等自然有序类型:直接用
Collections.sort(list),内部按自然顺序升序排列。
例如:ArrayList<integer> nums = new ArrayList(Arrays.asList(3, 1, 4)); Collections.sort(nums); // → [1, 3, 4]</integer> -
对自定义对象排序:需提供
Comparator,可用 Lambda 表达式简化。
例如:按学生年龄排序Collections.sort(students, (a, b) -> Integer.compare(a.getAge(), b.getAge())); -
使用 Stream 排序(不修改原列表):
List<string> sorted = list.stream().sorted().collect(Collectors.toList());</string>
若需降序:加Comparator.reverseOrder()或用sorted(Comparator.comparing(...).reversed())
查找指定元素的几种方法
根据是否已排序、是否需要索引、是否关心性能,选择合适方式:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
简单存在性判断:用
list.contains(obj),底层调用equals()逐个比较,时间复杂度 O(n)。 -
获取首次出现的索引:用
list.indexOf(obj),同样 O(n),返回 -1 表示未找到。 -
已排序前提下的高效查找(O(log n)):先确保已调用
Collections.sort(),再用Collections.binarySearch(list, key)。
注意:返回值 ≥ 0 表示找到,否则为插入点(负数),不能直接当布尔结果用。 -
查找所有匹配项(如重复元素):遍历 +
equals()或用 Stream 过滤:list.stream().filter(x -> x.equals(target)).collect(Collectors.toList())
注意事项与常见坑
实际开发中容易忽略的细节:
立即学习“Java免费学习笔记(深入)”;
-
排序前确认元素非 null,否则
NullPointerException;若可能含 null,Comparator需显式处理(如用Comparator.nullsLast())。 -
binarySearch要求严格升序,降序排列后必须传入对应Comparator,否则结果不可靠。 -
原始类型数组转 ArrayList 容易出错:不要用
Arrays.asList(int[]),它会把整个数组当一个元素;应先转为Integer[]或用IntStream。 -
并发修改风险:排序或查找过程中避免其他线程修改列表,否则可能抛
ConcurrentModificationException。
不复杂但容易忽略:排序和查找是两个独立操作,ArrayList 不自动维护有序性,每次查找前务必确认是否已排序,或按需选择合适策略。

















