`

Arrays.binarySearch

阅读更多

        今天在开发时,要判断一个逗号分隔的字符串中是否包含指定的字符串,考虑到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中的元素对象是否相等)。
 
分享到:
评论

相关推荐

    你清楚Arrays.binarySearch()方法的返回值吗?

    在Java编程语言中,`Arrays`类是Java.util包下的一个非常重要的工具类,它提供了大量用于操作数组的静态方法,其中包括我们今天要讨论的`binarySearch()`方法。`Arrays.binarySearch()`方法允许我们在有序数组中查找...

    java的Arrays类的应用.doc

    例如,`Arrays.binarySearch(array1, 3)`会返回元素3在`array1`中的位置,如果元素不存在,返回负数。 5. **数组克隆**: - `clone()`方法可以创建数组的一个副本。在示例中,`array2 = array1.clone()`创建了`...

    java arrays类.docx

    int index = Arrays.binarySearch(array, 3); System.out.println("元素 3 的索引:" + index); // 复制数组 int[] copiedArray = Arrays.copyOf(array, 3); System.out.println(Arrays.toString(copiedArray)...

    JAVA中工具类Arrays和异常处理的实例操作.doc

    `Arrays.binarySearch()`方法可以实现高效的二分查找。这种方法要求数组事先已经排序。该方法返回查找元素在数组中的索引位置,如果未找到则返回负数。 **示例代码**: ```java System.out.println(Arrays.binary...

    Java binarysearch方法原理详解

    Java中的binarySearch方法是Java.util.Arrays类提供的一个静态方法,用于在数组中搜索指定的元素。该方法有两个用法,分别是搜索整个数组和搜索指定范围内的元素。 binarySearch(Object[], Object key)方法 该方法...

    Java实验-数组的定义、初始化方法 掌握数组的遍历方法 掌握Arryas类的使用

    * Arrays.binarySearch()方法可以在数组中查找元素,例如:Arrays.binarySearch(数组,元素); * Arrays.equals()方法可以比较两个数组是否相等,例如:Arrays.equals(数组1,数组2); 四、实验结果分析 * 实验...

    Arrays类常用方法.docx

    那么使用Arrays.binarySearch(intArray, 3)将会返回索引2,因为数组中的第三个元素是3。 3. Arrays.sort(数组名) sort() 方法可以对数组进行排序,排序方式可以是升序或降序。例如,如果我们有一个int类型的数组...

    Java.binarySearch.docx

    在Java编程语言中,`binarySearch()`方法是`java.util.Arrays`类的一个静态方法,它采用二分查找算法来高效地在有序数组中查找指定的元素。二分查找是一种在有序数据集合中寻找目标值的算法,其效率远高于线性搜索。...

    java实例-数组(学习资料)

    在这个例子中,`Arrays.binarySearch(array, 2)`返回了元素2在排序后的数组中的索引位置,结果是5,因为元素2在排序后的数组中位于第五个位置。 接着,我们学习如何向数组中添加元素。`insertElement()`方法接收...

    BinarySearch:binarySearch

    在这个例子中,`Arrays.sort()`方法首先对数组进行排序,然后`Arrays.binarySearch()`会返回"cherry"在数组中的索引。如果未找到目标元素,`binarySearch()`会返回一个负数,该负数的绝对值是目标元素应插入的位置,...

    java中的Arrays这个工具类你真的会用吗(一文秒懂)

    int result = Arrays.binarySearch(arrays, 7); ``` 这个方法首先调用`binarySearch0`,内部实现包括两个步骤:确定查找范围并不断缩小查找区间,直到找到目标元素或确定不存在。如果找到目标元素,返回其索引;...

    Java JDK 6学习笔记——ppt简体版 第21章.ppt

    - **Arrays.binarySearch()方法**:这个方法提供了二分查找功能,可以在排序数组中查找指定元素,返回元素的索引或插入点。示例中查找85的位置: ```java int result = Arrays.binarySearch(arr1, 6, 9, 85); ``...

    java工具类-正则

    System.out.println(Arrays.binarySearch(arr, 5)); // 输出结果:2 System.out.println(Arrays.binarySearch(arr, 4)); // 输出结果:-3,表示没有找到该元素 ``` - **3. copyOfRange(int[] original, int from...

    数组与字符串.docx

    例如,`int position = Arrays.binarySearch(array, targetValue);` 查找目标值在数组中的位置。 #### 二、字符串的操作 字符串是字符序列的集合,Java中使用`String`类表示字符串。 1. **字符串的创建**: - ...

    Java语言基础入门教程 Java开发编程基础课程 第5章 数组 共8页.pptx

    查找数组中的某个元素可以通过遍历数组实现,也可以使用`Arrays.binarySearch()`方法(需要先排序)。 ```java int[] nums = {1, 2, 3, 5, 25}; Arrays.sort(nums); int index = Arrays.binarySearch(nums, 5); ``` ...

    在Java中如何高效的判断数组中是否包含某个元素Java开

    `Arrays.binarySearch()`方法可以实现这一点,但这需要确保数组已排序,否则结果可能不正确。 6. **使用Objects.equals()** - 当处理对象数组时,推荐使用`Objects.equals()`代替`==`,以处理可能的`null`值。例如...

    12道不错的数组例题

    - `Arrays.binarySearch()`方法可用于已排序数组的二分查找,返回元素的索引。如果数组未排序,先调用`Arrays.sort()`。 6. **数组复制与拷贝**: - `System.arraycopy()`方法用于复制数组的一部分或全部到另一个...

    Java实训教程 Java软件开发实战 Java类库 第4章 集合操作 共31页.pptx

    int index = java.util.Arrays.binarySearch(datas, (byte) 5); System.out.println(index); ``` - **填充**: - `fill()` 方法用于将数组的所有元素设置为特定的值,常用于初始化或重置数组。 - 示例代码: ...

Global site tag (gtag.js) - Google Analytics