为什么 java Arrays.binarySearch 返回奇怪的结果?

ten*_*ors 0 java

在标准 Java 11 库中,如果未找到元素,方法应返回:

...大于键的第一个元素的索引...

在 Java 11 上,此示例打印 17

int[] data = new int[] {2, 4, 5, 12, 17, 19};
System.out.println(data[-1 *Arrays.binarySearch(data, 6)]);
Run Code Online (Sandbox Code Playgroud)

在这个代码示例中,第一个大于 6 的元素是 12,但它返回索引 17。为什么?

Dea*_*ool 5

binarySearch?(int[] a, int key) :如果元素不存在,则返回 的索引(-(insertion point)-1)。所以在上面的情况下,插入点是3,表达式被评估为-4

(-(3)-1) --> (-3-1) --> -4
Run Code Online (Sandbox Code Playgroud)

而索引 4 对应值的数组是 17

Array --> {2, 4, 5, 12, 17, 19}
indexes -->0  1  2  3   4    5
Run Code Online (Sandbox Code Playgroud)

搜索关键字的索引,如果它包含在数组中;否则,(-(插入点) - 1)。插入点定义为将键插入数组的点:大于键的第一个元素的索引,如果数组中的所有元素都小于指定的键,则为 a.length。请注意,这保证了当且仅当找到键时返回值将 >= 0。