JAVA代码优化1-去重
场景:列表中去除重复值
想到的写法
List<String> distinctRes = new ArrayList<>();
for (String str: testList) {
if (!distinctRes.contains(str)) {
distinctRes.add(str);
}
}
结论:list.contains耗时久O(N),别用
看下源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++) // 速度取决于size大小
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++) // 速度取决于size大小
if (o.equals(elementData[i]))
return i;
}
}
优化1 - 用Set
StopWatch stopWatch = new StopWatch();
stopWatch.start();
List<String> distinctRes = new ArrayList<>(new HashSet(testList));
stopWatch.stop();
System.out.println("去重耗时" + stopWatch.getTotalTimeMillis());
结论:set.add(o)耗时久O(1)
源码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean contains(Ojbect o) return map.containsKey(o);
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}
优化2-用Stream
List<String> distinctRes = testList.stream().distinct().collect(Collectors.toList());
结论:stream耗时没hash快,但简洁