java基础:数组是否包含某元素

前言

在开发过程中,我们很多时候会判断某个集合是否包含某些参数,本文记录了平时常见的几种方式,以及查询效率,以备自用。

本次测试使用的是System.nanoTime测试:

1000000 n= 0.001s


测试代码

方式一、使用List

    public static void main(String[] args) {
        String[] arr = new String[]{"String1","String2","String3","String4","String5"};
        long start = System.nanoTime();
        for (int i = 0; i < 5000; i++) {
            userList(arr,"String4");
        }
        long end = System.nanoTime();
        long d = end-start;
        System.out.println("操作时间:" + (d/1000000));
    }

    public static void userList(String[] arr,String targetValue){
        boolean b = Arrays.asList(arr).contains(targetValue);
    }

方式二、使用Set

public static void main(String[] args) {
        String[] arr = new String[]{"String1","String2","String3","String4","String5"};
        long start = System.nanoTime();
        for (int i = 0; i < 5000; i++) {
            final boolean b = useSet(arr, "String5");
        }
        long end = System.nanoTime();
        long d = end-start;
        System.out.println("操作时间:" + (d/1000000));
    }

public static boolean useSet(String[] arr,String targetValue){
        Set set = new HashSet(Arrays.asList(arr));
        return set.contains(targetValue);
    }

方式三、使用循环判断

public static void main(String[] args) {
        String[] arr = new String[]{"String1","String2","String3","String4","String5"};
        long start = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            final boolean b = useFor(arr, "String5");
        }
        long end = System.nanoTime();
        long d = end-start;
        System.out.println("操作时间:" + (d/1000000));
    }

public static boolean useFor(String[] arr,String targetValue){
        for (String s : arr) {
            if(s.contains(targetValue)){
                return true;
            }
        }
        return false;
    }

方式四、使用Arrays.binarySearch()

public static void main(String[] args) {
        String[] arr = new String[]{"String1","String2","String3","String4","String5"};
        long start = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            final int resources = useBinarySearch(arr, "String5");
        }
        long end = System.nanoTime();
        long d = end-start;
        System.out.println("操作时间:" + (d/1000000));
    }

public static int useBinarySearch(String[] arr,String targetValue){
        int i = Arrays.binarySearch(arr, targetValue);
        return i;
    }

二、测试结果对比

1.5000次调用测试

userList:操作时间:1-3

userSet:操作时间:7-11

userFor:操作时间:2-4

userBinarySearch:操作时间:3-5

2.10000次调用测试

userList:操作时间:3-5

userSet:操作时间:9-13

userFor:操作时间:3-5

userBinarySearch:操作时间:5-6

3.100000次调用测试

userList:操作时间:7-12

userSet:操作时间:37-41

userFor:操作时间:7-12

userBinarySearch:操作时间:8-12


总结

经过自己电脑测试,也不知道是性能问题,还是其他,感觉除了set方式比较慢,其他都还差不多,这种记录方式,也就当自己对方式的扩展了,还可以通过Apache Commons类库中的ArrayUtils的contains方法来判断是否包含,Apache Commons类库中的ArrayUtils的contains方法的源码也是使用循环判断的方式。

你可能感兴趣的:(java,java)