黑马程序员_hashcode方法的作用和哈希算法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值