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