几种集合中查找指定元素的方法的执行效率

今天写代码的过程中遇到一个需求,从大数量的字符串(不重复!)中查找指定的字符串,突然想到集合的几种查找方法,分别是contains,indexOf以及Collections的binarySearch方法,就想尝试一下哪个执行效率更高,以下是测试代码:
 

    public static void main( String[] args )
    {
     //指定的字符串
     String str=null;
     //list用于存储生成字符串
     List<String> list=new ArrayList<String>();
     int cnt=new Random().nextInt(500000);
     for(int i =0;i<500000;i++){
      String uuid=UUID.randomUUID().toString().replace("-", "");
      list.add(uuid);
      //将随机位置的字符串赋值给指定字符串str
      if(i==cnt){
       str=uuid;
      }
     }
     //排序

     Collections.sort(list);

//使用Collections的二分法
     long start1=new Date().getTime();
     int idx1 = Collections.binarySearch(list, str);
     long end1=new Date().getTime();
     if(idx1>=0){
      System.out.println("Collections 二分法:"+(end1-start1)+"   索引为:"+idx1);
     }else{
      System.out.println("Collections 二分法:未找到");
     }
     
     //使用Arrays的二分法
     //将list转换为字符串数组
     String[] array = new String[list.size()];
     list.toArray(array);
     long start2=new Date().getTime();
     int idx2 = Arrays.binarySearch(array, str);
     long end2=new Date().getTime();
     if(idx2>=0){
      System.out.println("Arrays 二分法:"+(end2-start2)+"   索引为:"+idx2);
     }else{
      System.out.println("Arrays 二分法未找到.......");
     }
     //使用list的indexOf方法
     long start4=new Date().getTime();
     int idx4 = list.indexOf(str);
     long end4=new Date().getTime();
     if(idx4>=0){
      System.out.println("list indexOf:"+(end4-start4)+"   索引为:"+idx4);
     }else{
      System.out.println("list indexOf:未找到");
     }
 //使用list.contains方法
     for(int i=0;i<array.length;i++){
   list.add(array[i]);
     }
     long start3=new Date().getTime();
     boolean bl=list.contains(str);
     long end3=new Date().getTime();
     if(bl){
      System.out.println("list contains:"+(end3-start3));
     }else{
      System.out.println("list contains:未找到");
     }
    }
以下是执行结果:
第一次:
Collections 二分法:0   索引为:400793
Arrays 二分法:0   索引为:400793
list indexOf:16   索引为:400793
list contains:12
第二次:
Collections 二分法:0   索引为:301095
Arrays 二分法:0   索引为:301095
list indexOf:16   索引为:301095
list contains:8
第三次:
Collections 二分法:0   索引为:156585
Arrays 二分法:0   索引为:156585
list indexOf:12   索引为:156585
list contains:4
 
    由上可知,二分查找法不愧是大数据量查找的首选方法,当然其缺点也是显而易见的,即必须是有序序列,且就对Arrays和Collections的binarysearch方法来说,其返回的并不一定是查找到第一个匹配值的索引。对于contains和indexOf来说,如果只想知道是不是包含匹配值,则应该使用contains,如果还想返回具体位置,应该使用indexOf,虽然它的效率最低,但返回的是匹配值第一次出现的位置。



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值