黑马程序员——hashcode详解

来源:互联网 发布:破解公司网络限制 编辑:程序博客网 时间:2024/05/21 07:47

------------ http://www.itheima.com>android培训<http://www.itheima.com>java培训、期待与您交流! ----------






import java.util.ArrayList;

import java.util.Collection;
import java.util.HashSet;


public class ReflectTest2 {
public static void main(String[]args)
{
//Collection collections=new ArrayList();//4
Collection collections=new HashSet();//3
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);
/*判断两个对象是否==,是判断他们的hashcode是否相等,而
* hashcode默认的算法是根据他们的地址来算的,所以我们常说
* 比较两个对象是否==,是比较他们的地址是否相同。

* 所以复写hashcode方法后,即:让hashcode的算法不按地址来算
* 这样的话,pt1和pt3就被视为同一个对象。在hashset里面就只存了
* 2个元素。
* 对集合中的元素进行查找或判断,根本上都是依靠的他们的hashcode值(地址)。
* hashcode值通俗的叫地址。
*/
pt1.y=7;
collections.remove(pt1);
/*此时pt1是移不走的,因为我们复写的hashcode方法中
hashcode的算法是和x和y的值有关,当把pt1对象中y的值一变
那么pt1的hashcode值也变了,所以在集合中就找不到了。
这也是java中内存溢出的一个原因:即当你把对象都存在集合
中之后,又对对象进行了疯狂的操作,然后导致对象的hashcode值
变化了,虽然都还是同一个对象名字,但是存在集合中的对象,就相当于与外面的
对象失去了联系,你想删除也删不掉了。如果这种失去联系的元素越来越多,就会造成
内存溢出。
*/
System.out.println(collections.size());//4和3.

/*
* 总结:hashcode的作用:
* 1.优点:提高效率。在比如:hashset这样的集合中,可以利用hashcode值对集合内部进行分区。
* 一个值段可以分一区,这样分区之后,就可以提高查找的效率。即:要查找一个对象
* 先看他的hashcode值属于集合中哪个值段的,然后到这个值段对应的区去找,就提高
* 效率。因为hashset集合中查找元素就是对元素进行挨个判断hashcode是否相同,让在
* 判断内容是否相同,都相同了就是这个元素。
* 2.另外一个作用就是:可以重写hashcode方法自定义hashcode值的算法,来判断你使用的对象是否
* 相同。
* 缺点就是:可能会再次内存溢出。
* 如果将对象存入到Hashcode集合中后,在对对象进行操作,而操作的数据刚好也参与了它
* 的hashcode值的算法,那么操作完之后这个对象的hashcode值就也产生了变化。就会导致,你如果想
* 在操作集合中的这个对象时,就会找不到此对象,因为先后的hashcode值已变化。
* 如果大量的这样操作的加就会再次内存溢出。

* 目前为止:学习的内存溢出的情况有两种:
* 1.当用输出流写入数据时,当你定义了一个与数据大小一样的数组时,并且如果操作的数据是个电影,
* 数据非常大的话,就会造成内存溢出。
* 2.就是今天讲的,在底层数据结构是哈希表的集合,如果集合中大量对象的hashcode值发生了变化,
* 那么这些对象就与外界失去了联系,在频繁的操作过程中,造成内存溢出。
* */

}

------- "http://www.itheima.com"">android培训<"http://www.itheima.com">java培训、期待与您交流! ----------



0 0