SCJP啊SCJP。。。

本人小菜鸟。。SCJP考题。
public static class Quest{ 
                     public static void main(String[] args){ 
                            String[] colors =   
                                  {"blue","red","green","yellow","orange"}; 
                            Arrays.sort(colors); 
                            int s2 = Arrays.binarySearch(colors, "orange"); 
                            int s3 = Arrays.binarySearch(colors, "violet"); 
                           System.out.print(s2 + "" + s3); 
                    } 
            }
}
为啥s3是-5求高手解释下2分法检索

[code="java"]private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
Object key) {
int low = fromIndex;
int high = toIndex - 1;

while (low <= high) {
    int mid = (low + high) >>> 1;
    Comparable midVal = (Comparable)a[mid];
    int cmp = midVal.compareTo(key);

    if (cmp < 0)
    low = mid + 1;
    else if (cmp > 0)
    high = mid - 1;
    else
    return mid; // key found
}
return -(low + 1);  // key not found.
}

[/code]
人家是这样实现的,最后当然是-5啦

public static int binarySearch(Object[] a,
Object key)

使用二进制搜索算法来搜索指定数组,以获得指定对象。在进行此调用之前,必须根据数组元素的自然顺序 对数组进行升序排序(通过上面的 Sort(Object[] 方法)。如果没有对数组进行排序,则结果是不明确的。(如果数组包含不可相互比较的元素(例如,字符串和整数),则无法 根据数组元素的自然顺序对数组进行排序,因此结果是不明确的。)如果数组包含多个等于指定对象的元素,则无法保证找到的是哪一个。

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