java學習之ArrayList和HashSet的比較以及HashCode分析

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);

 則會刪除失敗,造成內存泄露

 

內存泄露就是有一個對象沒有用了,但也沒有被釋放掉,繼續佔有內存空間,這就叫內存泄露!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章