• 运用equals来比对对象或者是对象集合的removeAll等是需要重写equals和hashCode,IDEA重写equals和hashCode


    运用equals来比对对象或者是对象集合的removeAll等是需要重写equals和hashCode,IDEA重写equals和hashCode

    1、equals

    对于String和Integer等包装类而言,比较的是堆中的值。

    对于自定义的普通类,equals比较的是内存的首址,比较两边指向是不是同一个对象。

    注意:== 比较的也是内存的首址。

    a、如果用==来比较String类型就比较特殊了,对于String="a"这种赋值的,两个相同的值用==比较也是相同的,但是如果是new String()出来的用==比较就不相同了。因为对于赋值的,java会检查堆中是否有相同的值,如果有则新对象和老对象的地址都是该值在堆中的地址;new String()开辟的就是两个栈了,用==比较就不同了。

    b、对于包装类,比如Integer,进行自动装箱操作,如果数值在-128~127则会有缓存,==是相同的;如果数值不在那个范围,则不同。

    2、用equals比较对象需要重写equals和hashCode

    当equals被重写时,通常有必要重写hashCode,以维护hashCode的常规协定(该协定声明相等对象必须具有相等的哈希码)。

    hashCode用于散列数据的快速存取,如果用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashCode值来进行判断是否相同。

    (1)当Object1.equals(Object2)为true时,Object1.hashCode()==Object2.hashCode()必须为true。

    (2)当Object1.hashCode()==Object2.hashCode()为false时,Object1.equals(Object2)必须为false。

    如果我们重写了equals,意思就是只要对象的成员变量值都相等,那么equals就为true,但是如果不重写hashCode,那么再new一个新对象Object2,当Object1.equals(Object2)为true时,两者的hashCode却是不一样的,由此会产生理解不一致。

    3、对象集合的removeAll等操作(记得重写equals和hashCode)。

     (1)创建一个空的List集合:

    (2)创建List集合并初始化:

    (3)把一个集合全部添加到另一个集合里面:

    (4)把a集合包含有b集合的那包含部分删去:

    4、IDEA重写equals和hashCode

    (1)在实体类那里按 Alt+Insert 两个组合键,然后选 equals() and hashCode()

    (2) 然后一路默认下去

    到这里就可以用equals来比较对象和对象集合的removeAll等了。

  • 相关阅读:
    [转]Vetur can't find `tsconfig.json` or `jsconfig.json` in d:VueProjectsmyroute.
    疾病检验的概率的问题
    约束优化方法之拉格朗日乘子法与KKT条件
    GloVe与word2vec
    RNN、LSTM、GRU
    SVM 常见问题
    深度学习常用优化器算法Optimizer详解
    树模型-常见问题点
    leetcode 打家劫舍
    node 图片处理库 sharp
  • 原文地址:https://www.cnblogs.com/pzw23/p/12000755.html
Copyright © 2020-2023  润新知