Java語言中ArrayList和HashSet的區別
2019-04-10 13:22:49
一、基本區別
首先一起看個實例,其代碼如下:
package com.MrZ_baby.com;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class test_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList();
list.add("Test_4_1");
list.add("Test_4_1");
list.add("Test_4_1");
list.add("Test_4_1");
Set set = new HashSet();
set.add("Test_4_1");
set.add("Test_4_1");
set.add("Test_4_1");
set.add("Test_4_1");
System.out.println("List中數據大小為:"+list.size()+"\nSet中數據大小為:"+set.size());
}
}
運行結果為:
List中數據大小為:4
Set中數據大小為:1
結論:
- HashSet
1) HashSet不能夠存儲相同的元素,元素是否相同的判斷:重寫元素的equals方法。equals方法和hashCode方法必須兼容,如:equals方法判斷的是用戶的名字name,那么hashCode的返回的hashcode必須是name。hashcode();
2) HashSet存儲是無序的,保存的順序與添加的順序是不一致的,它不是線性結構,而是散列結構,(通過散列表:散列單元指向鏈表)。因此,HashSet的查詢效率相對比較高。
3) HashSet不是線程安全的,不是線程同步的。這需要自己實現線程同步:Collections.synchronizedCollection(),方法實現。
2.ArrayList
1) ArrayList中存放順序和添加順序是一致的。並且可重復元素。
2) 不是線程安全的,不是線程同步的。
3) ArrayList是通過可變大小的數組實現的,允許null在內的所有元素。
4) ArrayList適合通過位子來讀取元素。
二、性能比較區別
首先一起看個實例,其代碼如下:
package com.MrZ_baby.com;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class Test4_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Integer> set = new HashSet<>();
List<Integer> list = new ArrayList<>();
Long time_1 = System.currentTimeMillis();
for(int i = 0; i < 100000; i ++)
{
set.add(i);
}
Long time_2 = System.currentTimeMillis();
for(int i = 0; i < 100000; i ++){
list.add(i);
}
Long time_3 = System.currentTimeMillis();
System.out.println("往HashSet里面添加100000條數據花費時間為:" + ( time_2 - time_1 ));
System.out.println("往ArrayList里面添加100000條數據花費時間為:" + ( time_3 - time_2 ));
Long time_4 = System.currentTimeMillis();
for(Integer i : set){
}
Long time_5 = System.currentTimeMillis();
Iterator<Integer> item = set.iterator();
while (item.hasNext()) {
Integer str = item.next();
}
Long time_6 = System.currentTimeMillis();
for(Integer i : list){
}
Long time_7 = System.currentTimeMillis();
System.out.println("HashSet重復迭代(foreach) 100000次花費時間為:" + ( time_5 - time_4 ));
System.out.println("HashSet重復迭代(iterator) 100000次花費時間為:" + ( time_6 - time_5 ));
System.out.println("ArrayList重復迭代(foreach) 100000次花費時間為:" + ( time_7 - time_6 ));
}
}
運行結果為:



結論:
1) ArrayList始終比HashSet性能要高
2) HashSet每次添加總要判斷hashcode導致效率低
3) HashSet兩種循環中iterator 方式不穩定,不過總是比foreach要快一點
