Set和List集合中contains()方法执行效率问题:
Set.contains()的时间复杂度是O(1),而List.contains()的时间复杂度是O(n)。
所以在判断集合中是否包含某个元素时 ,如果集合是List,就通过Set的构造方法转为Set集合进行判断。
/**
* 把一个List分割成多个小的List
* @param list 被分割的List
* @param subLength 分割后每个小List的长度
* @param <T> List集合类型
* @return List<List<T>>
*/
public static <T> List<List<T>> groupList(List<T> list, int subLength) {
List<List<T>> listGroup = new ArrayList<>();
int size = list.size();
for (int i = 0; i < size; i += subLength) {
if (i + subLength > size) {
subLength = size - i;
}
List<T> newList = list.subList(i, i + subLength);
listGroup.add(newList);
}
return listGroup;
}
/**
* 获取两个List中不同的元素
*
* @param list1
* @param list2
* @param <T>
* @return
*/
public static <T> List<T> getDifferent(List<T> list1, List<T> list2) {
Map<T, Integer> map = new HashMap<>(list1.size() + list2.size());
List<T> diff = new ArrayList<>();
List<T> maxList = list1;
List<T> minList = list2;
if (list2.size() > list1.size()) {
maxList = list2;
minList = list1;
}
for (T i : maxList) {
map.put(i, 1);
}
for (T i : minList) {
Integer difValue = map.get(i);
if (difValue != null) {
map.put(i, ++difValue);
continue;
}
map.put(i, 1);
}
for (Map.Entry<T, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
diff.add(entry.getKey());
}
}
return diff;
}
/**
* 找出两个集合中相同的元素
*
* @param collmax
* @param collmin
* @return
*/
public static Collection getSame(Collection collmax, Collection collmin) {
//使用LinkedList防止差异过大时,元素拷贝
Collection csReturn = new LinkedList();
Collection max = collmax;
Collection min = collmin;
//先比较大小,这样会减少后续map的if判断次数
if (collmax.size() < collmin.size()) {
max = collmin;
min = collmax;
}
//直接指定大小,防止再散列
Map<Object, Integer> map = new HashMap<Object, Integer>(max.size());
for (Object object : max) {
map.put(object, 1);
}
for (Object object : min) {
if (map.get(object) != null) {
csReturn.add(object);
}
}
return csReturn;
}
本文探讨了Set和List在contains()方法上的效率差异,Set的时间复杂度为O(1),而List为O(n)。介绍了如何将List转换为Set以提高查找效率,并提供了将List分割、获取不同元素及找出相同元素的实用方法。
767

被折叠的 条评论
为什么被折叠?



