实际开发中, 我们可能需要翻译列表元素的属性值, 这部分值来自另外一个集合的数据.
如果直接使用双层循环方式, 那么嵌套循环方式时间复杂度: O(n^2)
, 此时可以考虑使用 Map
的方式, 优化嵌套循环的时间复杂度, Map
方式时间复杂度: O(n)
/**
* 双层 for 循环性能比 map 低很多
* 需要用到双层 for 的, 考虑先转内循环 list 为 map. key 为 id, value 为对象
*/
@Test
public void test2Loop() {
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
list1.add(String.valueOf(i));
}
List<String> list2 = new ArrayList<>();
for (int i = 50000; i < 150000; i++) {
list2.add(String.valueOf(i));
}
// 重合的 list
List<String> overlapList = new ArrayList<>();
long start = System.currentTimeMillis();
for (String str1 : list1) {
for (String str2 : list2) {
if (str1.equals(str2)) {
overlapList.add(str1);
break;
}
}
}
System.out.println("重合元素数量: " + overlapList.size());
// 20816ms 约 20s
System.out.println("双层 for 循环耗时: " + (System.currentTimeMillis() - start));
}
@Test
public void testMap() {
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
list1.add(String.valueOf(i));
}
List<String> list2 = new ArrayList<>();
for (int i = 50000; i < 150000; i++) {
list2.add(String.valueOf(i));
}
// 重合的 list
List<String> overlapList = new ArrayList<>();
//
Map<String, String> map = new HashMap<>();
// 先转内循环 list 为 map
for (String str : list2) {
map.put(str, str);
}
long start = System.currentTimeMillis();
for (String str1 : list1) {
String s = map.get(str1);
if (s != null) {
overlapList.add(s);
}
}
System.out.println("重合元素数量: " + overlapList.size());
// 15ms 相差了约 1400 倍
System.out.println("map 耗时: " + (System.currentTimeMillis() - start));
}