java_求出两个数组内的相同元素

去面试的时候遇到一个问题,请求String数组A和B之间相同的元素,当时写了两个for循环,这个是不行的,耗时太长。
自己在机器上试了一下,随机生成100000个数据,耗时

		java.lang.String[] a = new String[100000];
        java.lang.String[] b = new String[100000];
        for(int i = 0; i < 100000; i++){
            int c = (int) (Math.random() * 100000);
            int abs = Math.abs(c);
            a[i] = String.valueOf(abs);
        }
        for(int i = 0; i < 100000; i++){
            int c = (int) (Math.random() * 100000);
            int abs = Math.abs(c);
            b[i] = String.valueOf(abs);
        }

        //for & for
        ArrayList<String> forList = new ArrayList<>();
        long start = System.currentTimeMillis();
        for(int i = 0 ; i < a.length ; i++ ){
            for(int j = 0 ; j < b.length ; j++){
                if(a[i].equals(b[j])){
                    forList.add(a[i]);
                }
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时 : " + (end - start));
        System.out.println(forList);

在这里插入图片描述
使用hashset尝试解决问题

 		long start = System.currentTimeMillis();
        List<String> list1 = new ArrayList<>();
        HashSet<String> set = new HashSet<>(Arrays.asList(a));
        HashSet<String> strings = new HashSet<>(Arrays.asList(b));
        for(String s : set){
            if(strings.contains(s)){
                list1.add(s);
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start));
        System.out.println(list1);

在这里插入图片描述
使用Steam尝试解决

		HashSet<String> set = new HashSet<>(Arrays.asList(a));
        HashSet<String> strings = new HashSet<>(Arrays.asList(b));
		long l2 = System.currentTimeMillis();
        List<String> collect = set.stream().filter(strings::contains).collect(Collectors.toList());
        long l3 = System.currentTimeMillis();
        System.out.println("set & stream 耗时:" + (l3 - l2) + ", collect长度:" + collect.size());
        System.out.println(collect);

在这里插入图片描述
可以看到,无论使用哪一种方法耗时都比用两个for的耗时少太多了。开发的时候还是要注意避免使用多个for循环嵌套,否则会导致时耗问题,从而影响系统的性能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值