轉:ArrayList:用Set代替contains
在前面的一篇討論中已經指出了ArrayList的contains方法也是效率比較低的,應該儘量避免使用它!這裡有一個很實際的問題,就是已經有一個ArrayList,我要除去其中相同的元素,也就是希望得到一個不存在重複元素的List!
這裡同樣使用兩種方法:
1.生成一個新的ArrayList,新增之前看是否包含。
2.直接利用HashSet(HashMap的一個檢視),然後返回一個ArrayList。
public class Test {
private static List testContains(List l) {
List list = new ArrayList(100);
for (int i = 0; i < l.size(); i++) {
Object o = l.get(i);
if (!list.contains(o)) {
list.add(o);
}
}
return list;
}
private static List testSet(List l) {
return new ArrayList(new HashSet(l));
}
public static void test(int total, int cnt) {
long t1, t2;
List l = new ArrayList();
for (int i = 0; i < cnt; i++) {
l.add(new Integer(i));
}
t1 = System.currentTimeMillis();
for (int i = 0; i < total / cnt; i++) {
testContains(l);
}
t2 = System.currentTimeMillis();
long a = t2 - t1;
t1 = System.currentTimeMillis();
for (int i = 0; i < total / cnt; i++) {
testSet(l);
}
t2 = System.currentTimeMillis();
long b = t2 - t1;
System.out.println("List Size:" + cnt);
System.out.println("using Contains:" + a + "ms");
System.out.println("using Set:" + b + "ms");
System.out.println("Contains VS Set:" + (double) a / b + ":1");
}
public static void main(String[] args) {
int total = 100 * 1000;
int cnt = 1;
while (cnt < total) {
test(total, cnt);
cnt *= 10;
}
}
看一下輸出結果:
List Size:1
using Contains:94ms
using Set:203ms
Contains VS Set:0.4630541871921182:1
List Size:10
using Contains:47ms
using Set:47ms
Contains VS Set:1.0:1
List Size:100
using Contains:172ms
using Set:47ms
Contains VS Set:3.6595744680851063:1
List Size:1000
using Contains:1625ms
using Set:46ms
Contains VS Set:35.32608695652174:1
List Size:10000
using Contains:16047ms
using Set:94ms
Contains VS Set:170.7127659574468:1
當ArrayList的大小超過100,差別就比較明顯,不知道有沒有想過用刪除的方法,直接在列表中刪除重複的元素!
for(int i=0;i
l.remove(i);
}
}
這樣確實也可行呀,能想到這個方法還真不容易呢!除非你嫌你的CPU太快,否則根本不用考慮。這裡同時呼叫了三個效率低下的方法:indexOf,lastIndexOf,remove。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/treeroot/archive/2004/09/28/119778.aspx
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/220284/viewspace-1024318/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java——ArrayList中contains()方法中的疑問JavaAI
- ArrayList的contains方法與Object的equals方法的關係AIObject
- List集合(ArrayList-LinkedList);Set集合(HashSet-TreeSet)
- 用ADODB.Stream代替FSO讀取文字檔案 (轉)
- 【轉】SET SERVEROUTPUTServer
- 【轉】SET SERVEROUTPUT ONServer
- 用Mgaic Linux的核心和模組代替Debian的核心(轉)AILinux
- 將字串中的空格用 代替字串
- 用SUN官方的JVM代替JinitiatorJVM
- set 的應用
- Mac OS X 上用 otool 代替 lddMac
- java的各種集合為什麼不安全(List、Set、Map)以及代替方案Java
- JavaScript contains()JavaScriptAI
- jQuery :contains()jQueryAI
- 為什麼用「void 0」代替「undefined」Undefined
- Swift 3必看:dynamicType廢除,用type(of:)代替Swift
- 用ES6代替CoffeeScript
- 超實用 1 ArrayList 連結串列
- jQuery.contains()jQueryAI
- javascript contains方法JavaScriptAI
- 【java】【集合】去除ArrayList中的元素、ArrayList巢狀ArrayListJava巢狀
- ArrayList-Linked-Set的迴圈中刪除資料的錯誤顯示
- 在 Linux 上用 dust 代替 du更直觀Linux
- 如何說服別人?用故事代替資料
- 標量子查詢優化(用group by 代替distinct)優化
- 關於用設計模式代替if else的迷惑設計模式
- 用merge 語句代替 insert 和deletedelete
- shell中set命令詳解(轉)
- BASH shell set命令詳解(轉)
- sqlplus常用set指令(轉)SQL
- Java中Array與ArrayList之間的轉換Java
- sga contains infomation (71)AI
- 沃達豐希臘公司用Quarkus代替Spring Boot - quarkusSpring Boot
- CSS控制LI行字元溢位用省略號代替CSS字元
- 請用fontAwesome代替網頁icon小圖示網頁
- 用asmcmd 的rebal 代替 ASM_POWER_LIMIT 引數ASMMIT
- 使用 SCons 代替 Makefile 快速構建應用程式
- DNS二級域名自動跳轉 代替新網的跳轉功能DNS