最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Collections.binarySearch返回值解析:元素不存在时的处理
时间:2026-06-25 08:24:47 编辑:袖梨 来源:一聚教程网
Collections.binarySearch返回值≥0表示找到并返回索引;<0表示未找到,插入点=-(返回值)-1,范围在[0, list.size()]内,可直接用于list.add()。
Collections.binarySearch 返回值不是简单的“找到”或“没找到”,而是一个有明确含义的整数,尤其当元素不存在时,返回值包含位置线索,关键在于理解它的计算规则。
找到元素时:返回非负索引
如果目标元素存在于列表中,方法直接返回该元素在已排序列表中的实际索引(从 0 开始)。这个值 ≥ 0,可直接用于定位。
元素不存在时:返回负数,但隐含插入点
当元素不在列表中,返回值是 -(insertion point) - 1。这里的 insertion point 指的是:若将该元素插入列表以维持升序,它应放的位置索引(即第一个大于等于该元素的元素下标;若所有元素都更小,则为 list.size())。
- 例如列表 [1, 3, 5, 7] 中查找 4 → 插入点是 2(因为 5 在索引 2),返回值为 -(2) - 1 = -3
- 查找 0 → 插入点是 0,返回 -1
- 查找 9 → 插入点是 4(末尾),返回 -(4) - 1 = -5
如何安全提取插入点
只需对负数返回值做一次简单转换:插入点 = -(返回值) - 1。注意不能直接用 Math.abs,因为 -0 和 0 相同,且需区分正负逻辑。
- if (result
- 该位置可用于 add(pos, element) 维持有序,或判断“比谁大/比谁小”
前提条件必须满足
binarySearch 正确工作的前提是:列表已按**相同顺序**排序(自然序或指定 Comparator),且未被并发修改。否则结果不可预测,甚至抛出 ClassCastException 或 IndexOutOfBoundsException。
- 不要对未排序列表调用,结果无意义
- Comparator 必须与排序时使用的完全一致
- 推荐使用 List 接口的实现(如 ArrayList),避免 LinkedList(因随机访问慢,性能差)
相关文章
- 无限暖暖2.1版本下半奇迹之冠巅峰赛通关指南 06-27
- 逆战未来收藏室解锁攻略 06-27
- 逆战未来武器强度榜分析一览 06-27
- 心动小镇园艺怎么快速升级 06-27
- 息风谷战略邪线结局攻略 06-27
- 心动小镇水豚吃什么食物 06-27