Collections.binarySearch返回值≥0表示找到并返回索引;<0表示未找到,插入点=-(返回值)-1,范围在[0, list.size()]内,可直接用于list.add()。
Collections.binarySearch 返回值不是简单的“找到”或“没找到”,而是一个有明确含义的整数,尤其当元素不存在时,返回值包含位置线索,关键在于理解它的计算规则。
如果目标元素存在于列表中,方法直接返回该元素在已排序列表中的实际索引(从 0 开始)。这个值 ≥ 0,可直接用于定位。
当元素不在列表中,返回值是 -(insertion point) - 1。这里的 insertion point 指的是:若将该元素插入列表以维持升序,它应放的位置索引(即第一个大于等于该元素的元素下标;若所有元素都更小,则为 list.size())。
只需对负数返回值做一次简单转换:插入点 = -(返回值) - 1。注意不能直接用 Math.abs,因为 -0 和 0 相同,且需区分正负逻辑。
binarySearch 正确工作的前提是:列表已按**相同顺序**排序(自然序或指定 Comparator),且未被并发修改。否则结果不可预测,甚至抛出 ClassCastException 或 IndexOutOfBoundsException。