-
谁能给我讲讲 equals 和 hashcode 的关系和应用5
当需要判断两个对象相等时候,一直听到说 ,有的时候要重写equals的同时要重写 hashcode方法,看不懂,求高人教教我,谢谢,最好有例子,越具体越好
问题补充:gbfd2012 写道这个问题,,对于List类数组中ArrayList的类型,它可以存储重复类型的数据。。只是equals比较判断了下,而对于不重复的数组类型,如HashSet为了区别判读数组的元素是否重复引入了hashcode......举个例子,,比如HashSet数组中有1000个互相不重复的数据,,,现在向数组中添加一个新的数据。如果进入比较的话需要比较1000次,,效率可想而知,。利用hashcode,,可以增加效率。。。减少比较的次数。
hashcode就好像是一个签名。当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话两个对象就肯定不一样。
一般用hashcode来进行比较两个东西是不是一样的,可以很容易的排除许多不一样的东西。
最常用的地方就是在一堆东西里找一个东西。先用你要找的东西的hashcode和所有东西的hashcode比较,如果不一样的话就肯定不是你要找的东西。如果一样的话就很可能是你要找的东西。然后再进行仔细的比较两个东西是不是真的一模一样。
//一个不能加重复内容的容器
class Set {
Object[] objs = new Object[10]; //装东西的的数组
int size = 0; //已经有几个东西
//添加新东西,成功的话返回true,如果已经有了的话返回false
boolean add(Object o) {
for(int i=0;i<size;i++) { //搜索所有已经加进来的对象
if(objs[i].hashCode() == o.hashCode()) //如果hashcode一样的话就说明两个有可能是一样的
if(objs[i].equals(o)) return false; //仔细的确认一下是不是真的一样,如果一样的话就不加入这个对象
}
objs[size++]=o; //确认没有过这个东西,加入数组
return true;
}
}
当使用这个类的时候要确保两个一样的东西的hashcode肯定是一样的。两个不同的东西的hashcode可以是一样的,不过这样会减慢运行速度,所以尽量避免(也就是所谓的碰撞)。
---------------------------------------------------------------------------------
抱歉,再请问,那hashcode()这个方法要重写,该写点什么内容呢?怎么写呢?[color=red][/color]2011年1月15日 22:41
2个答案 按时间排序 按投票排序
-
采纳的答案
一个例子,,看下吧。。如果屏蔽public int hashCode()方法,,比较下。结果。
package Cs; import java.util.HashMap; import java.util.Map; public class Test2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Map map=new HashMap(); map.put(new PhoneNumber(020,1234567),"xx"); System.out.println(map.get(new PhoneNumber(020,1234567))); } private static class PhoneNumber{ /** * @param areaCode * @param extension */ public PhoneNumber(int areaCode, int extension) { this.areaCode =(short) areaCode; this.extension = (short)extension; } private short areaCode; private short extension; public boolean equals(Object o){ if(o==this){ return true; } if(!(o instanceof PhoneNumber)){ return false; } PhoneNumber pn=(PhoneNumber)o; return pn.extension==extension && pn.areaCode==areaCode; } //result就是我们得到的散列值,,计算过程有多种,这里只是个例子 public int hashCode(){ int result=17; result=37*result+areaCode; result=37*result+extension; return result; } } }
2011年1月17日 14:50
-
这个问题,,对于List类数组中ArrayList的类型,它可以存储重复类型的数据。。只是equals比较判断了下,而对于不重复的数组类型,如HashSet为了区别判读数组的元素是否重复引入了hashcode......举个例子,,比如HashSet数组中有1000个互相不重复的数据,,,现在向数组中添加一个新的数据。如果进入比较的话需要比较1000次,,效率可想而知,。利用hashcode,,可以增加效率。。。减少比较的次数。
hashcode就好像是一个签名。当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话两个对象就肯定不一样。
一般用hashcode来进行比较两个东西是不是一样的,可以很容易的排除许多不一样的东西。
最常用的地方就是在一堆东西里找一个东西。先用你要找的东西的hashcode和所有东西的hashcode比较,如果不一样的话就肯定不是你要找的东西。如果一样的话就很可能是你要找的东西。然后再进行仔细的比较两个东西是不是真的一模一样。
//一个不能加重复内容的容器
class Set {
Object[] objs = new Object[10]; //装东西的的数组
int size = 0; //已经有几个东西
//添加新东西,成功的话返回true,如果已经有了的话返回false
boolean add(Object o) {
for(int i=0;i<size;i++) { //搜索所有已经加进来的对象
if(objs[i].hashCode() == o.hashCode()) //如果hashcode一样的话就说明两个有可能是一样的
if(objs[i].equals(o)) return false; //仔细的确认一下是不是真的一样,如果一样的话就不加入这个对象
}
objs[size++]=o; //确认没有过这个东西,加入数组
return true;
}
}
当使用这个类的时候要确保两个一样的东西的hashcode肯定是一样的。两个不同的东西的hashcode可以是一样的,不过这样会减慢运行速度,所以尽量避免(也就是所谓的碰撞)。2011年1月16日 14:53
相关推荐
hashCode和equals方法的关系是Java中判断对象是否相等的两个重要方法。如果两个对象equals比较为相等,那么它们的hashCode值也必须相等。但是,如果两个对象的hashCode值相等,并不代表这两个对象equals比较也为相等...
Object类是所有Java类的父类,它定义了一些通用的方法,如equals()、hashCode()和toString()。数据类型类为基本数据类型如int、double、char等提供了封装类,如Integer、Double和Character,它们提供了额外的操作...
5. **@ToString** 和 **@EqualsAndHashCode**:这两个注解分别用于生成自定义的toString()方法和 equals() 及 hashCode() 方法,方便比较和打印对象信息。 6. **@Log**(如 @Log4j、@Slf4j 等):自动为类添加日志...
其中,`equals(Object o)`和`hashCode()`方法用于比较Map的等价性,确保了Map的正确比较和存储。插入和删除元素的操作由`put(Object key, Object value)`、`remove(Object key)`以及`clear()`等方法完成。`putAll...
如果当前桶有值( Hash 冲突),那么就要比较当前桶中的 key、key 的 hashcode 与写入的 key 是否相等,相等就赋值给 e,在第 8 步的时候会统一进行赋值及返回。 如果当前桶为红黑树,那就要按照红黑树的方式写入数据...
反之,`hashCode()`不相等意味着`equals()`一定不相等,但`hashCode()`相等并不能确保`equals()`相等。 7. **线程安全与ConcurrentHashMap** HashMap不是线程安全的,如果在多线程环境下使用,需要使用Collections...
### JSP 内置对象详解 #### 一、概述 ...通过合理利用这些内置对象,开发者可以更加高效地进行Web应用开发,同时也能提高代码的可维护性和扩展性。希望本文能帮助读者更好地理解和掌握JSP内置对象的相关知识。
`@Data`注解:这是一个复合注解,包含了`@ToString`、`@EqualsAndHashCode`、`@Getter`和`@Setter`,可以为类的所有非静态、非transient字段自动生成getter和setter方法,同时提供toString()、equals()和hashCode()...
hashCode()和equals()方法可以根据需要重写,例如根据对象的特征生成hashCode值。 二、Java IO 1. 讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。 Java IO中的常见类有InputStream、OutputStream...