equals() hashcode 方法同时重写问题 如题,请高手用浅显易懂的语言解答。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 书上这么说的: equals()本身是比较对象的内存地址是否相同,您可以重写该方法。-----------(1) 在重写该方法时,建议同时重写hashCode()方法。-------------(2) 因为在哈希码为基础的相关环境中,需要比较两个对象是否为相同的对象时,除了使用equals之外,还会依hashCode方法来判断。-------(3) 例如加入HashSet容器中的对象就必须重写equals与hashCode,作为加入HashSet中唯一对象的识别。---------(4)对(1)理解。对(2)中”建议“请坐解释。对(3)中“哈希码为基础的相关环境”和为什么“还会依hashCode方法来判断”请分别解释。对(4)中此时的“必须”作解释并与问题(2)中的“建议”作区别。同时指出怎样成为“HashSet中唯一对象的识别”的过程作解释。谢谢前辈们。 import java.util.HashSet;import java.util.Set;class Person { private String name; Person(String name) { this.name = name; } public String getName() { return this.name; }}public class Test { public static void main(String[] args) { Set set = new HashSet(); set.add(new Person("A")); set.add(new Person("A")); System.out.println(set.size()); }}结果: 2//是不是和我们期待想象的结果1有出入?!这里就需要重写equals方法了在Person中添加equals方法 public boolean equals(Object obj) { return this.name.equals(((Person) obj).name); }结果:2//这就是为什么建议(实际大多数时候必须)重写hashCode,因为Set在比较两个对象是否相等时还需要比较它们的hashCode)在Person中添加hashCode方法(完整代码如下)import java.util.HashSet;import java.util.Set;class Person { private String name; Person(String name) { this.name = name; } public String getName() { return this.name; } public boolean equals(Object obj) { return this.name.equals(((Person) obj).name); } public int hashCode() { //下面的代码只为说明问题使用,实际不可能这样!! if (this.getName() == "A") return 1; else return 2; }}public class Test { public static void main(String[] args) { Set set = new HashSet(); set.add(new Person("A")); set.add(new Person("A")); System.out.println(set.size()); }}//结果:1OK,正常了!! 这里equals hashCode 也没用,它怎么自己调用的呢? 有用啊,如果不重写equals(),那么2个PERSON “A”由于都会被添加到SET中,与想表达的意思出现了差距吧 这段代码中 也没有直接的调用equals 和 hashcode方法啊 请指教 2.建议的意思就是你重写了equals(),但是你不重写hashCode()并不会有问题,只是以后可能会在某处出现你意想不到的事情。3.你去看下HashSet类的add等相关方法。4.其实4楼已经举了例子了。也就是说,把对象加入到HashSet容器的时候,你不重写equals与hashCode方法也不会报错,只是,不重写equals与hashCode,恐怕对编程人员来讲就失去了用HashSet的意义了。所以要重写equals方法,重写过后发现姓名相同的对象被认为是同一个人,这没问题。可是HashSet还要去检查这两个对象是否有相同的hashCode,(类似于我们国家,要检查你身份证一样,毕竟重名的人太多)如果hashCode返回的值还是相同,则认为相同,则不加入到HashSet中,对我们编程人员来讲,HashSet的意义变得重大了。这样我们就能根据我们自己的规定,来认为,到底什么样的人算是一个人。当对象要作为键值或者索引来使用的时候,要重写equals与hashCode,也是一样的道理。不重写不会报错,只是这样做,对我们没有什么意思。 HashSet.add();public boolean add(E e) { return map.put(e, PRESENT)==null;//这里其实是把加入add中的参数作为key,用静态常量的Object作为value,储存在map中 }然后:public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode());//这里,调用了add中参数的hashCode 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; } 关于字符串去重的问题 急,一个关于JAVA中写入操作的问题请教. 菜鸟求I/0解惑 菜鸟发问:递归列出某个文件夹中所有文件并保存到文件数组... 关于java声明的问题! 存储过程如下:select * from tablename,求用JDBC代码调用存储过程,并且打印出值 关于import的一个基础问题 请教一个Eclipse的菜鸟问题. 简单的问题:出现NoClassDefFindError linux 下的设置问题 如何快速知道,某个组件能触发多少事件,好象API帮助没有这一项,如,按钮有ActionListener, MouseListener 我的卖票程序怎么停下来?
equals()本身是比较对象的内存地址是否相同,您可以重写该方法。-----------(1)
在重写该方法时,建议同时重写hashCode()方法。-------------(2)
因为在哈希码为基础的相关环境中,需要比较两个对象是否为相同的对象时,除了使用equals之外,还会依hashCode方法来判断。-------(3)
例如加入HashSet容器中的对象就必须重写equals与hashCode,作为加入HashSet中唯一对象的识别。---------(4)
对(1)理解。
对(2)中”建议“请坐解释。
对(3)中“哈希码为基础的相关环境”和为什么“还会依hashCode方法来判断”请分别解释。
对(4)中此时的“必须”作解释并与问题(2)中的“建议”作区别。同时指出怎样成为“HashSet中唯一对象的识别”的过程作解释。谢谢前辈们。
import java.util.Set;class Person {
private String name; Person(String name) {
this.name = name;
} public String getName() {
return this.name;
}
}public class Test { public static void main(String[] args) {
Set set = new HashSet();
set.add(new Person("A"));
set.add(new Person("A"));
System.out.println(set.size());
}
}
结果: 2
//是不是和我们期待想象的结果1有出入?!这里就需要重写equals方法了
在Person中添加equals方法
public boolean equals(Object obj) {
return this.name.equals(((Person) obj).name);
}
结果:2
//这就是为什么建议(实际大多数时候必须)重写hashCode,因为Set在比较两个对象是否相等时还需要比较它们的hashCode)
在Person中添加hashCode方法(完整代码如下)
import java.util.HashSet;
import java.util.Set;class Person {
private String name; Person(String name) {
this.name = name;
} public String getName() {
return this.name;
} public boolean equals(Object obj) {
return this.name.equals(((Person) obj).name);
} public int hashCode() {
//下面的代码只为说明问题使用,实际不可能这样!!
if (this.getName() == "A")
return 1;
else
return 2;
}
}public class Test { public static void main(String[] args) {
Set set = new HashSet();
set.add(new Person("A"));
set.add(new Person("A"));
System.out.println(set.size());
}
}
//结果:1
OK,正常了!!
3.你去看下HashSet类的add等相关方法。
4.其实4楼已经举了例子了。也就是说,把对象加入到HashSet容器的时候,你不重写equals与hashCode方法也不会报错,
只是,不重写equals与hashCode,恐怕对编程人员来讲就失去了用HashSet的意义了。
所以要重写equals方法,重写过后发现姓名相同的对象被认为是同一个人,这没问题。
可是HashSet还要去检查这两个对象是否有相同的hashCode,(类似于我们国家,要检查你身份证一样,毕竟重名的人太多)
如果hashCode返回的值还是相同,则认为相同,则不加入到HashSet中,
对我们编程人员来讲,HashSet的意义变得重大了。
这样我们就能根据我们自己的规定,来认为,到底什么样的人算是一个人。当对象要作为键值或者索引来使用的时候,要重写equals与hashCode,也是一样的道理。
不重写不会报错,只是这样做,对我们没有什么意思。
HashSet.add();public boolean add(E e) {
return map.put(e, PRESENT)==null;//这里其实是把加入add中的参数作为key,用静态常量的Object作为value,储存在map中
}
然后:public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());//这里,调用了add中参数的hashCode
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;
}