hashCode,equals,Map

hashCode,equals都是属于Object类里面的方法,hashCode是根据内存地址通过算法计算出来的散列码,equals是比较对象的内存地址是否相同。equals相等的对象,其hashCode一定相等,hashCode相等的对象,equals不一定相等。hashCode和equals会应用于HashSet,HashMap,HashTable这一类的散列集合,所以一般自定义实现equals的时候也要重新实现hashCode方法。实现equals时候需要注意通用约定,自反性(a.equals(a) == true),对称性(a.equals(b) == true; b.equals(a) == true),传递性(a.equals(b) == true; b.equals(c) == true; a.equals(c) == true),一致性(参与比较的对象引用没有发生变化,其结果也不会变),非空性(a.equals(null) == false)

HashMap

内部通过数组和链表实现,保存一个新的对象,先根据hashCode计算出hash,再通过hash计算出对应于存放数组的下标,如果当前位置已经有对象,则通过链表的形式,进行链接,然后将原来的值替换成插入的值。

HashMap&HashTable

HashMap不是线程安全的,HashTable是线程安全的,HashMap允许key,value都为null,HashTable则都不允许。

ConcurrentHashMap&HashTable

同样适用于多线程的环境,但是当容量增加到一定程度的时候,HashTable的性能会下降很多,应该迭代器遍历的时候,会锁住整个表,而ConcurrentHashMap仅仅锁住部分map

 

转载于:https://my.oschina.net/u/2308196/blog/3018318

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,equalshashCode方法是用来比较对象的内容和确定对象的哈希值的方法。当我们使用自定义对象作为Map的key时,我们需要重写equalshashCode方法,以便正确地比较对象和生成正确的哈希值。 下面是重写equalshashCode方法的步骤: 1. equals方法: equals方法用于比较两个对象的内容是否相同。 - 首先,我们需要检查传入的对象是否为null,如果为null,则返回false。 - 然后,我们需要检查传入的对象是否与当前对象是同一类型,如果不是,则返回false。 - 接着,我们需要将传入的对象强转为当前类型,然后比较每个属性是否相等。 - 最后,返回比较结果。 下面是一个示例: ``` @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (getClass() != obj.getClass()) { return false; } MyClass other = (MyClass) obj; return Objects.equals(this.name, other.name) && this.age == other.age; } ``` 2. hashCode方法: hashCode方法用于确定对象的哈希值。 - 首先,我们需要定义一个常量,用于计算哈希值。 - 然后,我们需要将每个属性的哈希值相加,得到一个总的哈希值。 - 最后,返回总的哈希值。 下面是一个示例: ``` @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Objects.hashCode(this.name); result = prime * result + this.age; return result; } ``` 注意,这里用到了Objects.hashCode方法,它可以处理为null的情况,避免了NullPointerException的发生。 总的来说,重写equalshashCode方法非常重要,它可以确保我们正确地比较对象和生成正确的哈希值,从而让我们的程序更加健壮和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值