arrays.binarysearch本身不直接去重,但配合排序可实现轻量可控去重:先按指定字段排序,再对每个元素用binarysearch判断是否首次出现(返回索引等于当前索引),仅保留首次出现项,结果有序且内存友好。

Arrays.binarySearch 本身不直接去重,但它能配合排序实现轻量、可控的去重逻辑。关键不在“查”,而在“查+序+位置推算”的组合用法——适用于中小规模、已知结构、需保持有序的场景。
前提:必须先排序,且排序方式与查找逻辑一致
binarySearch 不处理无序数据。对自定义结构(比如 Person 对象)去重,第一步永远是统一排序依据:
- 若按姓名去重,就用
Arrays.sort(arr, Comparator.comparing(p -> p.getName())) - 若按 ID 去重,就用
Arrays.sort(arr, Comparator.comparingInt(Person::getId)) - 排序后数组必须严格升序;降序或部分乱序会导致 binarySearch 返回值完全失真
核心技巧:用 binarySearch 判断“首次出现位置”
对已排序数组中每个元素,调用 Arrays.binarySearch(arr, arr[i], comparator),若返回值等于 i,说明它是该值在数组中的第一个位置——即去重后的保留项。
- 例如:
Person[] people = {p1, p2, p3}已按 name 排序,p1.name == p2.name -
binarySearch(people, p1, comp)返回 0 → 保留 p1 -
binarySearch(people, p2, comp)返回 0(不是 1)→ 不保留 p2
构建去重后新数组的简洁写法
不依赖 Stream 或 Set,纯数组操作,内存友好:
- 遍历原数组,对每个
arr[i]执行pos = binarySearch(arr, arr[i], comp) - 只当
pos == i时,将arr[i]复制到结果数组 - 结果数组天然有序,长度即为去重后数量
注意边界和类型安全
自定义结构必须满足 binarySearch 的契约:
- 比较器
Comparator不能返回 null,且逻辑要与排序所用的一致 - 避免混用基本类型重载(如传
Person[]却调用binarySearch(int[], int)) - 如果对象字段可能为 null,比较器中需显式处理,否则抛
NullPointerException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











