---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、hashcode方法的作用和哈希算法
哈希算法是将一个集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每个组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象对应存储在那个区域。Object类中定义了一个hashcode()方法来返回每个Java对象的哈希码。方便在HashSet集合中快速查找某一个对象。
注意:
(1)要想hashcode()方法生效,对象必须存储在哈希集合中,才有价值。
(2)当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进hashset集合中时的哈希值就不同了,这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果。
二、什么是内存泄漏:
它是指,在Java内存中存在一些对象,而且这些对象已经不再使用,但还是贮留在内存中没有被释放。例如:
package cn.itcast.day1;
import java.util.Collection;
import java.util.HashSet;
public class ReflectTest2 {
public static void main(String[] args) {
/**
* ArrayList 有顺序的集合,但不是排序顺序,是可重复,存的是引用
* HashSet 如果有则不放,无顺序,不可重复
*/
//Collection collections= new ArrayList();
Collection collections= new HashSet();
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);
System.out.println(collections.size());//此时是2
pt1.y=7;
collections.remove(pt1);
System.out.println(collections.size());//前面已经删除一个pt1,但是集合的大小还是2
}
}
在上述代码中,集合collections中共新增了3个对象,分别为pt1,pt2,pt3。但根据pt1和pt3在此集合中看作是一个对象,此时集合的大小为2,在更该pt1.y=7后,接着又删除pt1对象,理论上讲集合大小应该变成1,但实际打印出的值为2,为什么呢?因为更改了y的值,而y又参与了hashcode方法的运算,所以前后计算的哈希码不一致,所以哈希算法到不同的区域内寻找pt1对象,也就是说remove方法没有去pt1对象之前存在的那个哈希区域找pt1,而是在新的哈希值所对应的区域去寻找pt1对象,因此不能找到pt1对象,也就不能删除pt1对象,但既然想删除pt1.说明对象pt1已经无用,但它还贮留在内存中占用内存空间,所以出现了内存泄漏。
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>