用HashSet的add方法谈hashcode和equals方法重写
本文主要通过用HashSet的add方法讲一下hashCode和equals方法重写。错误的地方望指正。
1.了解HashSet的add方法
了解一个方法的好办法是看源码,所以先看源码
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
由上面可以知道HashSet里面是用的HashMap处理,add方法其实是用了map的put方法
transient Entry<K,V>[] table;
transient int modCount;
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
table即前面已经存在的数据,这里会将已存在的内容的key与当前key做比较,e.hash == hash && ((k = e.key) == key || key.equals(k)),其中hash是根据hashcode计算,一般情况下,hashCode一致,hash也是一样的。如果比较的是true的话,将已存在的value改成新的。对于hashset其实就原值没变只是在内部的hashmap的value重新放了new Object().
2.例子
到这里我想应该都知道,如何来重写了。这里简单做一个例子。
public class UnlockGood {
public UnlockGood(){}
public UnlockGood(String skuNo, int wmsId,int count) {
super();
this.skuNo = skuNo;
this.count = count;
this.wmsId = wmsId;
}
//商品编码
private String skuNo;
//数量
private int count;
//仓库ID
private int wmsId;
public String getSkuNo() {
return skuNo;
}
public void setSkuNo(String skuNo) {
this.skuNo = skuNo;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getWmsId() {
return wmsId;
}
public void setWmsId(int wmsId) {
this.wmsId = wmsId;
}
@Override
public boolean equals(Object obj) {
UnlockGood good = (UnlockGood)obj;
if(this==obj){
return true;
}else if(this.getSkuNo().equals(good.getSkuNo())&&this.getWmsId()==good.getWmsId()){
good.setCount(good.getCount()+this.getCount());
return true;
}else{
return false;
}
}
@Override
public int hashCode() {
//随便写一个hashCode
return 1;
}
}
上面是重写的hashCode和equals方法,下面是main方法
Set<UnlockGood> unlockgoods = new HashSet<UnlockGood>();
UnlockGood good = new UnlockGood("a",1,2);
unlockgoods.add(good);
UnlockGood good1 = new UnlockGood("a",1,12);
unlockgoods.add(good1);
UnlockGood good2 = new UnlockGood("b",1,2);
unlockgoods.add(good2);
这里利用的是如果hash一致的时候,会调用equals方法,当然如果是同一个key就不会调用equals方法的。利用这个特性对原始值进行修改,达到自己想要的元素加入规则。
用HashSet的add方法谈hashcode和equals方法重写的更多相关文章
- Object 方法的 hashCode,equals方法源码
文章目录 hashCode方法注释 equals 方法注释 equals 方法 hashCode方法注释 Object 的 hashCode 方法,是本地方法: Returns a hash code ...
- 使用hashCode()和equals()方法 - Java
在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...
- 关于HashCode和equals方法在HashSet中的使用
Object类是类层次结构的根类,故所有的类都是先该类的方法,其中HashCode()和equals()方法也是该类的方法. 1.HashCode()方法 Object类中HashCode()方法实现 ...
- Java 中正确使用 hashCode 和 equals 方法
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
- hashcode和equals方法的区别和联系
说到 hashcode就要和Java中的集合,HashSet,HashMap 关系最为密切. 首先附录两张Java的集合结构图: 图二:(上图的简化版) 从Set集合的特点说起 & Set是如 ...
- (转)Java 中正确使用 hashCode 和 equals 方法
背景:最近在编写持久化对象时候遇到重写equals和hashCode方法的情况,对这两个方法的重写做一个总结. 链接:https://www.oschina.net/question/82993_75 ...
- 如何重写hashCode()和equals()方法
hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...
随机推荐
- cocos2d-x 2.2.5 安卓工程编译的问题
原址:http://www.cocoachina.com/bbs/read.php?tid=217124 新的cocos2d-x 2.2.5 在使用Eclipse的安卓NDK 9 的编译器进行编译的时 ...
- C#反射实例化类并调用类的方法
反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力. 它允许程序创建和控制任何类的对象,无需提前硬编码目标类: SalBLL a = (SalBLL)Assembly.Load("B ...
- vim编辑十六进制文件
首先用二进制方式打开 vim file -b 之后输入 :%!xxd 还原为二进制文件 :%!xxd -r
- USB枚举过程(2)
用bus hound 得到的数据 GET MAX LUN 命令 详见USB_MSC_BlukOnly_v1.0 接下来用到的是UFI SCSI
- hdu 1576 A/B (扩展欧几里德简单运用)
http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others) Memory Lim ...
- HDU 5927 Auxiliary Set (dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5927 题意: 给你一棵树,其中有一些'不重要'的点,要是这些'不重要'的点的子树中有两个重要的点的LC ...
- HDU 4496 D-City (并查集)
题意:给定一个图,问你每次删除一条边后有几个连通块. 析:水题,就是并查集的运用,倒着推. 代码如下: #include <cstdio> #include <string> ...
- KMP算法初探
[edit by xingoo] kmp算法其实就是一种改进的字符串匹配算法.复杂度可以达到O(n+m),n是参考字符串长度,m是匹配字符串长度. 传统的算法,就是匹配字符串与参考字符串挨个比较,如果 ...
- WPF中的ControlTemplate(控件模板)(转)
原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/28/690993.html WPF中的ControlTemplate(控件模板) ...
- How to Send Information (String, Image, Record) Between Two Applications
http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm here are many situation when you need t ...