最新下载
热门教程
- 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(因随机访问慢,性能差)
相关文章
- 华为hg255d路由器怎样刷机(华为hg255d路由器刷机方法) 08-16
- 华为荣耀路由器入口(华为荣耀路由器入口位置) 08-16
- 华为路由器自动断网怎么回事(华为路由器自动断网什么原因) 08-16
- 华为路由器变砖了怎么办(华为路由器变砖了怎么解决) 08-16
- 华为面板路由器怎么设置(华为面板路由器设置教程) 08-16
- 华为a2路由器覆盖面积(华为a2路由器覆盖面积有多大) 08-16