Java 基于传递字符串长度的Hashcode方法实现 公共级狗{ 字符串名; 公共狗(字符串名称){ this.name=名称; } 公共布尔等于(对象o){ 如果((this==o)和((Dog)o).name==name){ 返回true; }否则{ 返回false; } } 公共int hashCode(){ 返回name.length(); } } 班猫{ } 列举宠物{ 狗、猫、马 } 类映射测试{ 公共静态void main(字符串[]args){ Map m=新的HashMap(); m、 put(“k1”,新狗(“爱子”); m、 放置(“k2”,宠物。狗); m、 放置(Pets.CAT,“猫钥匙”); 狗d1=新狗(“三叶草”); m、 put(d1,“狗钥匙”); m、 放置(新的Cat(),“Cat钥匙”); System.out.println(m.get(“k1”); 字符串k2=“k2”; 系统输出println(m.get(k2)); System.out.println(m.get(Pets.CAT)); 系统输出println(m.get(d1)); System.out.println(m.get(new Cat()); //无法理解下面的部分代码 d1.name=“木兰”; System.out.println(m.get(d1));//#1//打印狗键 d1.name=“三叶草”; System.out.println(m.get(newdog(“clover”));//2//打印空 d1.name=“亚瑟”; System.out.println(m.get(newdog(“clover”));//3//打印空 } }
我试图理解kathy和berts为SCJP6编写的书中的hashcode()实现。虽然我对hashcode实现有基本的了解,但书中的一个场景把我弄糊涂了,我对输出感到困惑 根据上述计划,它说:Java 基于传递字符串长度的Hashcode方法实现 公共级狗{ 字符串名; 公共狗(字符串名称){ this.name=名称; } 公共布尔等于(对象o){ 如果((this==o)和((Dog)o).name==name){ 返回true; }否则{ 返回false; } } 公共int hashCode(){ 返回name.length(); } } 班猫{ } 列举宠物{ 狗、猫、马 } 类映射测试{ 公共静态void main(字符串[]args){ Map m=新的HashMap(); m、 put(“k1”,新狗(“爱子”); m、 放置(“k2”,宠物。狗); m、 放置(Pets.CAT,“猫钥匙”); 狗d1=新狗(“三叶草”); m、 put(d1,“狗钥匙”); m、 放置(新的Cat(),“Cat钥匙”); System.out.println(m.get(“k1”); 字符串k2=“k2”; 系统输出println(m.get(k2)); System.out.println(m.get(Pets.CAT)); 系统输出println(m.get(d1)); System.out.println(m.get(new Cat()); //无法理解下面的部分代码 d1.name=“木兰”; System.out.println(m.get(d1));//#1//打印狗键 d1.name=“三叶草”; System.out.println(m.get(newdog(“clover”));//2//打印空 d1.name=“亚瑟”; System.out.println(m.get(newdog(“clover”));//3//打印空 } },java,scjp,Java,Scjp,我试图理解kathy和berts为SCJP6编写的书中的hashcode()实现。虽然我对hashcode实现有基本的了解,但书中的一个场景把我弄糊涂了,我对输出感到困惑 根据上述计划,它说: 在对get()的第一次调用中,hashcode是8(magnolia),并且 应该是6(clover),因此检索在步骤1失败,我们得到 空 在对get()的第二次调用中,哈希代码都是6,因此步骤1 成功。一旦进入正确的存储桶(“名称长度=6”) 调用equals()方法,并且由于Dog的equals()
- 在对get()的第一次调用中,hashcode是8(magnolia),并且 应该是6(clover),因此检索在步骤1失败,我们得到 空
- 在对get()的第二次调用中,哈希代码都是6,因此步骤1 成功。一旦进入正确的存储桶(“名称长度=6”) 调用equals()方法,并且由于Dog的equals() 方法比较名称,equals()成功,输出为Dog key
- 在第三次调用get()时,hashcode测试成功,但 equals()测试失败,因为arthur不等于clover
上面的三行讨论了名称的长度及其相关的hashcode()实现,但在调用get()方法时如何比较长度?hashcode值是正确的,它等于8。不应该像你建议的那样6岁。 您正在更改d1所指的名称值 制作d1.name=“magnolia”时 在步骤1中,由于hashcode函数名的原因,它为null,并且在hashmap中找不到“magnolia”散列索引。) 重要提示:Map使用hashcode和equals。 hashcode用于在hashmap中查找对象。找到此对象时,将调用equals以确保它们确实与您期望的值相同。 您的哈希代码应该是唯一的。想一想,如果你有相同长度的不同名字。 另外,确保函数名是hashCode、等于并重写它们。
我不知道为什么hashcode是基于长度的,但我建议您使用HashCodeBuilder()和EqualBuilder()。hashcode值是正确的,它等于8。不应该像你建议的那样6岁。 您正在更改d1所指的名称值 制作d1.name=“magnolia”时 在步骤1中,由于hashcode函数名的原因,它为null,并且在hashmap中找不到“magnolia”散列索引。) 重要提示:Map使用hashcode和equals。 hashcode用于在hashmap中查找对象。找到此对象时,将调用equals以确保它们确实与您期望的值相同。 您的哈希代码应该是唯一的。想一想,如果你有相同长度的不同名字。 另外,确保函数名是hashCode、等于并重写它们。
我不知道为什么hashcode是基于长度的,但我建议您使用HashCodeBuilder()和EqualBuilder()。hashcode值是正确的,它等于8。不应该像你建议的那样6岁。 您正在更改d1所指的名称值 制作d1.name=“magnolia”时 在步骤1中,由于hashcode函数名的原因,它为null,并且在hashmap中找不到“magnolia”散列索引。) 重要提示:Map使用hashcode和equals。 hashcode用于在hashmap中查找对象。找到此对象时,将调用equals以确保它们确实与您期望的值相同。 您的哈希代码应该是唯一的。想一想,如果你有相同长度的不同名字。 另外,确保函数名是hashCode、等于并重写它们。
我不知道为什么hashcode是基于长度的,但我建议您使用HashCodeBuilder()和EqualBuilder()。hashcode值是正确的,它等于8。不应该像你建议的那样6岁。 您正在更改d1所指的名称值 制作d1.name=“magnolia”时 在步骤1中,由于hashcode函数名的原因,它为null,并且在hashmap中找不到“magnolia”散列索引。) 重要提示:Map使用hashcode和equals。 hashcode用于在hashmap中查找对象。找到此对象时,将调用equals以确保它们确实与您期望的值相同。 您的哈希代码应该是唯一的。想一想,如果你有相同长度的不同名字。 另外,确保函数名是hashCode、等于并重写它们。
我不知道为什么您的hashcode是基于长度的,但我建议您使用HashCodeBuilder()和EqualsBuilder()。equals实现与文本内容不匹配。对于不同的对象,它永远不会是真的!另外,
hashcode
应该有一个大写字母public class Dog {
String name;
public Dog(String name) {
this.name = name;
}
public boolean equals(Object o) {
if ((this == o) && ((Dog) o).name == name) {
return true;
} else {
return false;
}
}
public int hashCode() {
return name.length();
}
}
class Cat {
}
enum Pets {
DOG, CAT, HORSE
}
class MapTest {
public static void main(String[] args) {
Map<Object, Object> m = new HashMap<Object, Object>();
m.put("k1", new Dog("aiko"));
m.put("k2", Pets.DOG);
m.put(Pets.CAT, "CAT Key");
Dog d1 = new Dog("Clover");
m.put(d1, "Dog key");
m.put(new Cat(), "Cat key");
System.out.println(m.get("k1"));
String k2 = "k2";
System.out.println(m.get(k2));
System.out.println(m.get(Pets.CAT));
System.out.println(m.get(d1));
System.out.println(m.get(new Cat()));
// UNABLE TO UNDERSTAND BELOW PART OF CODE
d1.name = "magnolia";
System.out.println(m.get(d1)); // #1 //prints Dog Key
d1.name = "clover";
System.out.println(m.get(new Dog("clover"))); // #2 // prints null
d1.name = "arthur";
System.out.println(m.get(new Dog("clover"))); // #3 // prints null
}
}
import java.util.*;
class MapTest {
static class Dog {
String name;
public Dog(String name) {
this.name = name;
}
public boolean equals(Object o) {
if ((this == o)) {
return true;
} else if (((Dog)o).name.equals(this.name)) {
return true;
} else {
return false;
}
}
public int hashCode() {
return name.length();
}
}
static class Cat {
}
static enum Pets {
DOG, CAT, HORSE
}
public static void main(String[] args) {
Map<Object, Object> m = new HashMap<Object, Object>();
m.put("k1", new Dog("aiko"));
m.put("k2", Pets.DOG);
m.put(Pets.CAT, "CAT Key");
Dog d1 = new Dog("Clover");
m.put(d1, "Dog key");
m.put(new Cat(), "Cat key");
System.out.println(m.get("k1"));
String k2 = "k2";
System.out.println(m.get(k2));
System.out.println(m.get(Pets.CAT));
System.out.println(m.get(d1));
System.out.println(m.get(new Cat()));
// UNABLE TO UNDERSTAND BELOW PART OF CODE
d1.name = "magnolia";
System.out.println(m.get(d1)); // #1
d1.name = "clover";
System.out.println(m.get(new Dog("clover"))); // #2
d1.name = "arthur";
System.out.println(m.get(new Dog("clover"))); // #3
}
}