查乙個lista 的每個值(string字串)在另外乙個listb中是否存在,如果不存在就記錄下來。
模擬資料量:100萬
方法一:
直接呼叫list自帶的removeall方法
public static void main(string args) throws ioexception
for (int i = 0; i < 1000000; i++)
long starttime = system.currenttimemillis();
lista.removeall(listb);
long endtime = system.currenttimemillis();
}
耗時:好幾分鐘了都沒好,等不下去
原因:
removeall()內部的實現如下,直接實現暴力遍歷的方法:
public boolean removeall(collection<?> c)
}return modified;
}再看看方法內部的contains(),也是直接暴力
public boolean contains(object o) else
return false;
}
方法二(jdk為1.8):
借用hashmap,空間換取時間
public static void main(string args) throws ioexception
for (int i = 0; i < 1000000; i++)
long starttime = system.currenttimemillis();
hashmapmap = new hashmap();
for (int i = 0; i < 1000000; i++)
lista.clear();
for (int i = 0; i < 1000000; i++)
}long endtime = system.currenttimemillis();
}
耗時:535ms,1秒不到。
分析:
與方法一不同的地方是,我們借用了hashmap(jdk1.8),為什麼要用hashmap,
其實是因為hashmap的containskey方法,jdk1.8後它引入了紅黑樹,優化了查詢速度(查詢時間複雜度為 o(logn))。
其實現如下
public boolean containskey(object key)
final nodegetnode(int hash, object key) while ((e = e.next) != null);}}
return null;
}
了解:hashmap 在 jdk 1.8 後新增的紅黑樹結構
jdk1.7中hashmap底層實現原理
高效比較兩個list集合中的差集
listdifferent new arraylist listmaxlist list1 listminlist list2 if list2.size list1.size mapmap new hashmap maxlist.size for department department max...
python 兩個list 求交集,並集,差集
在python中,陣列可以用list來表示。如果有兩個陣列,分別要求交集,並集與差集,怎麼實現比較方便呢?當然最容易想到的是對兩個陣列做迴圈,即寫兩個for迴圈來實現。這種寫法大部分同學應該都會,而且也沒有太多的技術含量,本博主就不解釋了。這裡給大家使用更為裝bility的一些方法。老規矩,talk...
兩個List取差集
兩個物件list,直接比較是不行的,因為他們存的位址不一樣 需要重寫gethashcode 與equals object obj 方法告訴電腦 public class model public string name public override intgethashcode public ov...