ArrayList的去重问题

面试被问及arraylist的去重问题,现将自己想的两种解决方案写在下面

/**
 * Description:
 * ClassName:Uniq
 * Package:com.syd.interview
 * Date:2018/7/3 18:59
 * Author: syd-fish
 */
public class Uniq {

    public static void main(String[] args) {
        List<String> stringList = generateRandom(100000);

        long t1 = System.nanoTime();
        boolean flag = uniqSet(stringList);
        long t2 = System.nanoTime();
        if (flag){
            System.out.println("nanoTime-set = [" + (t2-t1)+ "]");
        }else{
            System.err.print("error");
        }

        long t3 = System.nanoTime();
        boolean flag2 = uniqArrayList(stringList);
        long t4 = System.nanoTime();
        if (flag){
            System.out.println("nanoTime-ArrayList = [" + (t4-t3)+ "]");
        }else{
            System.err.print("error");
        }


    }

    private static List<String> generateRandom(int m){
        List<String> list = new ArrayList<String>();
        for (int i=0;i<m ; i++) {
            list.add("Monday");
            list.add("Tuesday");
            list.add("Wednesday");
            list.add("Thursday");
            list.add("Friday");
            list.add("Saturday");
            list.add("Sunday");
            list.add("January");
        }
        return list;
    }
    private static boolean uniqSet(List<String> stringList){
        Set<String> set = new HashSet<String>();
        boolean flag = true;
        for (String str : stringList){
            set.add(str);
        }
        if (8 == set.size()) {
            flag = true;
        }else {
            flag = false;

        }
        return flag;
    }

    private static boolean uniqArrayList(List<String> stringList){
        List<Object> list = new ArrayList<Object>();
        Iterator it = stringList.iterator();
        boolean flag;
        while (it.hasNext()){
            Object str = it.next();
            if (!list.contains(str)){
                list.add(str);
            }
        }
        if (8 == list.size()) {
            flag = true;
        }else {
            flag = false;

        }
        return flag;
    }
}

 当m小于10000的量级时,uniqArrayList性能要好于uniqSet。

arraylist的初始默认容量是10,hashset的初始默认容量是16,所以二者都不存在扩容的问题

set的底层数据结构是哈希表,特点是添加慢,查找迅速;

arraylist的底层数据结构是数组,特点是添加迅速,查找慢;

所以当数据量小的时候,添加占主导因素,uniqArrayList性能要好于uniqSet,

当达到一定的数据量的时候,查找占主导因素,uniqSet性能要好于uniqArrayList。

猜你喜欢

转载自www.cnblogs.com/syd-fish-cat/p/9260376.html