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 基于传递字符串长度的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()

我试图理解kathy和berts为SCJP6编写的书中的hashcode()实现。虽然我对hashcode实现有基本的了解,但书中的一个场景把我弄糊涂了,我对输出感到困惑

根据上述计划,它说:

  • 在对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
    }
}