用hashmap做的一个equals、hashcode的一个小实验

直接上结论(,小实验,大神绕行,鄙视勿喷。)

向hashmap中相继放入两键值对,(o1->”1st”)、(o1->”2ed”)

 

O1\o2 equals

O1\o2的hashcode相等

Map的大小

最后的结果

第一种情况

1

(o1->”2ed”)

第二种情况

2

o2->”2ed”

第三种情况

2

o1->”1st”)、(o1->”2ed”

第二种情况:集合类发生严重错误

第三种情况:不满足要求


至此,理顺了equals和hashcode


更进一步:HashMap中put与get的实现http://blog.csdn.net/zfq642773391/article/details/5491862

 

//可看可不看/

 

实验1:相继插入两个(键值对象equals并且hashcode相等)的键值对,键对象不被覆盖,值对象会被覆盖。

 

Hashmap的键值的类型:当属性i相同时,其equals,且hashcode相等

package map;

 

publicclass O {

   

    private String i;

    private String msg;

   

 

   

 

    public String getI() {

        returni;

    }

 

    publicvoid setI(String i) {

        this.i = i;

    }

 

    public String getMsg() {

        returnmsg;

    }

 

    publicvoid setMsg(String msg) {

        this.msg = msg;

    }

 

    @Override

    publicboolean equals(Object obj) {

        if (obj == null) {

            returnfalse;

        }

        if (!(obj instanceof O)) {

            returnfalse;

        }

        final O o = (O) obj;

        returnthis.getI() == o.getI();

       

    }

 

    @Override

    publicint hashCode() {

        returnthis.getI().hashCode();

        //return super.hashCode();

    }

   

   

   

 

}

 

 

测试一下:

package map;

 

import java.util.HashMap;

import java.util.Map;

 

publicclass T {

 

    publicstaticvoid main(String[] args) {

       

        Map<O, String> map = new HashMap<O, String>();

       

        O o1 = new O();

        O o2 = new O();

        o1.setI("1");

        o1.setMsg("i am o1");

        o2.setI("1");

        o2.setMsg("i am o2");

 

        map.put(o1, "1st");

        map.put(o2, "2ed");

       

    }

 

}

 

 

结果:

 


 

///

 

实验2:相继插入两个(键值对象不equals而hashcode相等)的键值对,

1、Map的size为2,然而其中只有一个键值对。

2、第一个被放入的键值对完全被第二个代替

 

 

package map;

 

publicclass O {

   

    private String i;

    private String msg;

   

 

   

 

    public String getI() {

        returni;

    }

 

    publicvoid setI(String i) {

        this.i = i;

    }

 

    public String getMsg() {

        returnmsg;

    }

 

    publicvoid setMsg(String msg) {

        this.msg = msg;

    }

 

   

//  @Override

//  public boolean equals(Object obj) {

//      if (obj == null) {

//          return false;

//      }

//      if (!(obj instanceof O)) {

//          return false;

//      }

//      final O o = (O) obj;

//      return this.getI() == o.getI();

//     

//  }

 

    @Override

    publicboolean equals(Object obj) {

        returnsuper.equals(obj);

    }

 

    @Override

    publicint hashCode() {

        returnthis.getI().hashCode();

        //return super.hashCode();

    }

}

 

 

 

结果


1、Map的size为2,然而其中只有一个键值对。

2、第一个被放入的键值对完全被第二个代替

 

 

///

 

实验2:相继插入两个(键值对象equals而hashcode不等)的键值对,两个键值对都被放进去了。

package map;

 

publicclass O {

   

    private String i;

    private String msg;

   

 

   

 

    public String getI() {

        returni;

    }

 

    publicvoid setI(String i) {

        this.i = i;

    }

 

    public String getMsg() {

        returnmsg;

    }

 

    publicvoid setMsg(String msg) {

        this.msg = msg;

    }

 

   

    @Override

    publicboolean equals(Object obj) {

        if (obj == null) {

            returnfalse;

        }

        if (!(obj instanceof O)) {

            returnfalse;

        }

        final O o = (O) obj;

        returnthis.getI() == o.getI();

       

    }

 

    @Override

    publicint hashCode() {

        //return this.getI().hashCode();

        returnsuper.hashCode();

    }

   

   

   

 

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值