ArrayList
是對象的有順序排放
HashSet
當一個對象放進去時,先檢查裏面有無相等的對象(equals),有相等的對象就不放進去
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
public class ReflectTest2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection collections= new HashSet(); //new ArrayList();
ReflectPoint pt1= new ReflectPoint(3,3);
ReflectPoint pt2= new ReflectPoint(5,5);
ReflectPoint pt3= new ReflectPoint(3,3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
System.out.println(collections.size());
}
}
當是HashSet時輸出3 最後一個 collections.add(pt1);並沒有放進去,當是new ArrayList();是輸出是4
HashCode方法:將集合分成若干個存儲區域,每個對象可以計算出一個哈希碼,將哈希碼分組,每組分別對應某個存儲區域,根據一個對象的哈希碼就可以確定該對象存儲在哪個區域
當一個對象被存儲進HashSet集合中以後,就不能修改這個對象中那些參與哈希值計算的字段了,否則,對象修改後的哈希值與最初存儲進HashSet集合中的哈希值就不同了,這種情況下,將會導致無法從HashSet集合中單獨刪除當前對象,從而造成內存泄露
如
collections.add(pt1);
pt1.y=4;
collections.remove(pt1);
則會刪除失敗,造成內存泄露
內存泄露:就是有一個對象沒有用了,但也沒有被釋放掉,繼續佔有內存空間,這就叫內存泄露!