1.binarySearch方法调用的两种方法
1.Arrays.binarySearch(ints1,0,5,3);
2.Arrays.binarySearch(ints1,3);
1.1 第一种方式
解释:ints1 是传入的数组名,支持的类型是
所有的数组类型
不论是对象,引用,字符串,还是 字符,
总而言之,只要是数组,就能传入
第二个数字
:代表我们要搜索范围的下限下标 ,该下标包括在内
**第三个数字:**代表我们要搜索范围上限的下标,该下标不包括在内,包括该下标-1的下标,我们称为:
上限实际下标
**第四个数字:**我们要搜索的,
目标
2第二张方式
解释:第二种方式直接全数组搜索,第一个是数组,第二个是目标
2.binarySearch的返回值
2.1 返回值
1.
在范围内搜索到该目标
:返回目标的数组下标
2.
要搜索的目标比搜索范围的数字都大
:返回:
(上限实际下标+1)的负值
3.
要搜索的目标比搜索范围的数字都小
,返回:
(下限下标+1)的负值
4要搜索的目标在范围内:
返回:最后
中间值+1的负值
3源码:
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;
@SuppressWarnings("rawtypes")
Comparable midVal = (Comparable)a[mid];
@SuppressWarnings("unchecked")
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.
}
对返回值结果源码的分析:
1.小于任何数字:
——————返回的return -(low + 1); 其中low一直不变,所以**(下限下标+1)的负值**
2.大于任何数字:
——————最以上限下标不变,low比上限大1,再加1就是实际上限+2
然后返回该负值
3.大小在内部:
——————但是没有搜索到:这时候,循环条件一定不成立,low>high
之前的low就和high一样的大小,mid
low
high,其中1,2 条件下最终也是,mid
low
high ,只不过有一个上限或者下限不变,以此好表示
在内部的最后还是返回其-(low + 1)
总结
-------只要找到该值,一定返回的是正数,否则一定返回的是负数,
通过和0的比较,来判断是否找到该值