今天在开发时,要判断一个逗号分隔的字符串中是否包含指定的字符串,考虑到aaa,aaa10,aaa11这种字符串无法正确判断aaa是否存在。因此先将调String的split方法将其转换成字符串数组。然后再用for循环或ArrayUtils.contains判断即可,后来在使用时发现Array.binarySearch(arr,obj)方法,虽然二分法查找需要被查找的数组已经是排好序的,但每次将查找范围缩小一半,元素比较的效率大大提高。特别越往后,二分法的耗时基本不变,而用contains()比较的耗时越来越大。
一.public static int binarySearch(int[] a, int key)说明
使用二进制搜索算法来搜索指定的 int 型数组,以获得指定的值。
必须在进行此调用之前对数组进行排序(通过上面的 sort 方法)。如果没有对数组进行排序,则结果是不明确的。
如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。
参数: a - 要搜索的数组。 key - 要搜索的值。
返回: 搜索键的索引,如果它包含在列表中;否则返回 (-(插入点) - 1)。
插入点被定义为将键插入列表的那一点:即第一个大于此键的元素索引,如果列表中的所有元素都小于指定的键,则为 list.size()。
注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。 另请参见: sort(int[])
二.实例说明如果没有对数组进行排序,则结果是不明确的
字符串“218”在字符串“2180,2180,218,2180,21820,2180,2181,217”中,但如果没有对数组进行排序,其返回-1,表明未包含在列表中。
import java.util.Arrays; public class BinarySearchTest { public static void main(String[] args) { String code = "218"; String str = "2180,2180,218,2180,21820,2180,2181,217"; String[] dArray = str.split(","); int res = Arrays.binarySearch(dArray, code); System.out.println(res); } }
运行结果:-1
而经过Arrays.sort(dArray)排序后,结果运行正确。
import java.util.Arrays; public class BinarySearchTest { public static void main(String[] args) { String code = "218"; String str = "2180,2180,218,2180,21820,2180,2181,217"; String[] dArray = str.split(","); Arrays.sort(dArray); int res = Arrays.binarySearch(dArray, code); System.out.println(res); } }
运行结果:1
三.比较测试一下Arrays.binarySearch、list.contains两种方法的效率差异
package com.bijian.study; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class EffCompare { public static void main(String[] args) { List list = new ArrayList(10000); for(int i=0;i<100000;i++){ list.add("jack"+i); } String[] array = (String[]) list.toArray(new String[10000]); Arrays.sort(array); long begin = System.currentTimeMillis(); for(int k=60000;k<70000;k++){ //1 int index = Arrays.binarySearch(array, "jack"+k); //System.out.println(Arrays.binarySearch(array, "jack"+k)); } long end = System.currentTimeMillis(); System.out.println("二分法查找10000个item消耗:"+(end-begin)+"毫秒"); begin = System.currentTimeMillis(); for(int n=60000;n<70000;n++){ //2 boolean iist = list.contains("jack"+n); //System.out.println(list.contains("jack"+n)); } end = System.currentTimeMillis(); System.out.println("contains查找10000个item消耗:"+(end-begin)+"毫秒"); } }运行结果:
二分法查找10000个item消耗:8毫秒 contains查找10000个item消耗:14174毫秒测试的时候可以将 1,2 处的代码改为for(int n=0;n<10000;n++){,for(int n=90000;n<100000;n++){,可以发现,起始值越往后,二分法的耗时基本不变,而用contains()比较的耗时越来越大,原因当然是contains方法进行了越来越多的equals()调用(需要不断的调用equals()方法来比较这个对象和String[]中或List中的元素对象是否相等)。
相关推荐
在Java编程语言中,`Arrays`类是Java.util包下的一个非常重要的工具类,它提供了大量用于操作数组的静态方法,其中包括我们今天要讨论的`binarySearch()`方法。`Arrays.binarySearch()`方法允许我们在有序数组中查找...
例如,`Arrays.binarySearch(array1, 3)`会返回元素3在`array1`中的位置,如果元素不存在,返回负数。 5. **数组克隆**: - `clone()`方法可以创建数组的一个副本。在示例中,`array2 = array1.clone()`创建了`...
int index = Arrays.binarySearch(array, 3); System.out.println("元素 3 的索引:" + index); // 复制数组 int[] copiedArray = Arrays.copyOf(array, 3); System.out.println(Arrays.toString(copiedArray)...
`Arrays.binarySearch()`方法可以实现高效的二分查找。这种方法要求数组事先已经排序。该方法返回查找元素在数组中的索引位置,如果未找到则返回负数。 **示例代码**: ```java System.out.println(Arrays.binary...
Java中的binarySearch方法是Java.util.Arrays类提供的一个静态方法,用于在数组中搜索指定的元素。该方法有两个用法,分别是搜索整个数组和搜索指定范围内的元素。 binarySearch(Object[], Object key)方法 该方法...
* Arrays.binarySearch()方法可以在数组中查找元素,例如:Arrays.binarySearch(数组,元素); * Arrays.equals()方法可以比较两个数组是否相等,例如:Arrays.equals(数组1,数组2); 四、实验结果分析 * 实验...
那么使用Arrays.binarySearch(intArray, 3)将会返回索引2,因为数组中的第三个元素是3。 3. Arrays.sort(数组名) sort() 方法可以对数组进行排序,排序方式可以是升序或降序。例如,如果我们有一个int类型的数组...
在Java编程语言中,`binarySearch()`方法是`java.util.Arrays`类的一个静态方法,它采用二分查找算法来高效地在有序数组中查找指定的元素。二分查找是一种在有序数据集合中寻找目标值的算法,其效率远高于线性搜索。...
在这个例子中,`Arrays.binarySearch(array, 2)`返回了元素2在排序后的数组中的索引位置,结果是5,因为元素2在排序后的数组中位于第五个位置。 接着,我们学习如何向数组中添加元素。`insertElement()`方法接收...
在这个例子中,`Arrays.sort()`方法首先对数组进行排序,然后`Arrays.binarySearch()`会返回"cherry"在数组中的索引。如果未找到目标元素,`binarySearch()`会返回一个负数,该负数的绝对值是目标元素应插入的位置,...
int result = Arrays.binarySearch(arrays, 7); ``` 这个方法首先调用`binarySearch0`,内部实现包括两个步骤:确定查找范围并不断缩小查找区间,直到找到目标元素或确定不存在。如果找到目标元素,返回其索引;...
- **Arrays.binarySearch()方法**:这个方法提供了二分查找功能,可以在排序数组中查找指定元素,返回元素的索引或插入点。示例中查找85的位置: ```java int result = Arrays.binarySearch(arr1, 6, 9, 85); ``...
System.out.println(Arrays.binarySearch(arr, 5)); // 输出结果:2 System.out.println(Arrays.binarySearch(arr, 4)); // 输出结果:-3,表示没有找到该元素 ``` - **3. copyOfRange(int[] original, int from...
例如,`int position = Arrays.binarySearch(array, targetValue);` 查找目标值在数组中的位置。 #### 二、字符串的操作 字符串是字符序列的集合,Java中使用`String`类表示字符串。 1. **字符串的创建**: - ...
查找数组中的某个元素可以通过遍历数组实现,也可以使用`Arrays.binarySearch()`方法(需要先排序)。 ```java int[] nums = {1, 2, 3, 5, 25}; Arrays.sort(nums); int index = Arrays.binarySearch(nums, 5); ``` ...
`Arrays.binarySearch()`方法可以实现这一点,但这需要确保数组已排序,否则结果可能不正确。 6. **使用Objects.equals()** - 当处理对象数组时,推荐使用`Objects.equals()`代替`==`,以处理可能的`null`值。例如...
- `Arrays.binarySearch()`方法可用于已排序数组的二分查找,返回元素的索引。如果数组未排序,先调用`Arrays.sort()`。 6. **数组复制与拷贝**: - `System.arraycopy()`方法用于复制数组的一部分或全部到另一个...
int index = java.util.Arrays.binarySearch(datas, (byte) 5); System.out.println(index); ``` - **填充**: - `fill()` 方法用于将数组的所有元素设置为特定的值,常用于初始化或重置数组。 - 示例代码: ...