zoukankan      html  css  js  c++  java
  • ArrayList_HashSet的比较及Hashcode分析

    ArrayList_HashSet的比较及Hashcode分析

      hashCode()方法的作用

      

       

    复制代码
    public static void main(String[] args) {
            Collection collection = new HashSet<>();
            ReflectPoint pt1 = new ReflectPoint(3, 3);
            ReflectPoint pt2 = new ReflectPoint(5, 5);
            ReflectPoint pt3 = new ReflectPoint(3, 3);
            
            collection.add(pt1);
            collection.add(pt2);
            collection.add(pt3);
            collection.add(pt1);
            
    //        pt1.y = 7;  //修改后hashCode值就不同了,导致找不到这个对象了,也无法删除
            collection.remove(pt1);
            
            /**
          1.如果实体类只重写了equals(),没有重写hashCode() 则collection总的个数为3
           因为,在存储一个对象进HashSet中时,如果没有重写hashCode方法,导致两个对象计算出来的hashCode值是不相同的(hashCode值是根据对象在内存中的地址计算出来的)
           我在我的区域里边找,不在那个已经存储同样对象的区域里边找,所以这个对象还是会被存储进去

          为了让相等的对象找到在相同的区域,就有一个说法,如果两个对象的equals相等时,应该让他们的hashCode也应该相等
          如果对象没有要存到hash集合里边,就没必要重写hashCode();
    * 如果要放入HashSet中的对象没有重写hashCode方法和equals方法, * 两个对象的引用不同,还是会存入HashSet中,默认的equals方法使用 == 比较两个对象的内存地址值 * 如果重写hashCode与equals方法,会认为是相同的对象,后边要存入的存入不了 * * 当一个对象被存进HashSet集合中后,就不能修改这个对象中参与计算哈希值的字段了,否则,对象 * 修改后的哈希值与最初存进HashSet集合中的哈希值就不同了,在这种情况下,即使在 * contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回 * 不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。 */ System.out.println(collection.size()); /** * 通常来说,一个类的两个实例对象用equals()方法比较的结果相等时,他们的哈希吗也必须相等,但 * 反之则不成立,及equals方法比较结果不相等的对象可以有相同的哈希码,或者说哈希吗相同的两个对象, * equals方法比较的结果可以不相同,例如 字符串"BB"和"Aa"的equals比较结果不相同,但hashCode()结果相等。 */ System.out.println("BB".hashCode()); // System.out.println("Aa".hashCode()); }
    复制代码

    内存泄漏的问题也可以用此例子举例,

    所谓内存泄漏,就是这个对象不再使用了可一直占用内存空间,无法释放掉。

  • 相关阅读:
    「模板」 树套树
    [Luogu 3701] 「伪模板」主席树
    「模板」 可持久化平衡树
    「模板」 割点
    [Luogu 2596] ZJOI2006 书架
    省选有感。(不是游记)
    [Luogu 2604] ZJOI2010 网络扩容
    MySql聚簇索引与非聚簇索引的区别
    四层负载均衡和七层负载均衡的区别
    Redis利用Pipeline加速查询速度的方法
  • 原文地址:https://www.cnblogs.com/wq3435/p/6247024.html
Copyright © 2011-2022 走看看