面试被问及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。