iteye_8384 2010-12-01 11:47
浏览 179
已采纳

HashSet的存储问题

[code="java"]
public class Stu implements Comparable {
private String name;
private String address;
private String sex;
private int age;

public Stu(String name, String address, String sex, int age) {
    super();
    this.name = name;
    this.address = address;
    this.sex = sex;
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getSex() {
    return sex;
}

public void setSex(String sex) {
    this.sex = sex;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public int compareTo(Stu o) {
    if (this.name.compareTo(o.name) > 0) {
        return 1;
    } else if (this.name.compareTo(o.name) < 0) {
        return -1;
    } else {
        return 0;
    }
}

public String toString() {
    return new StringBuilder().append("name = ").append(this.name).append(
            " address = ").append(this.address).append(" sex = ").append(
            this.sex).append(" age = ").append(this.age).toString();
}

public boolean equals(Stu obj) {
    return (this.name.equals(obj.name));
}

public int hashCode() {
    return this.name.hashCode();
}

}
[/code]

[code="java"]
public class CollectionTest {

private static Set<Stu> set = new HashSet<Stu>();

public static void main(String[] args) {

    initHashSet();
    System.out.println();
    printHashSet();
}


public static void initHashSet() {

    Stu stu1 = new Stu("stu9", "neu1", "male", 20);
    Stu stu2 = new Stu("stu2", "neu2", "female", 22);
    Stu stu3 = new Stu("stu6", "neu3", "male", 23);
    Stu stu4 = new Stu("stu4", "neu5", "male", 24);
    Stu stu5 = new Stu("stu4", "neu4", "female", 9);

    System.out.println("stu4.equals(stu5) = " + stu4.equals(stu5));
    System.out.println("stu4.hash = " + stu4.hashCode()+ " ; stu5.hash = " + stu5.hashCode());

    set.add(null);
    set.add(stu1);
    set.add(stu2);
    set.add(stu3);
    set.add(stu4);
    set.add(stu5);
}

public static void printHashSet() {
    for (Stu i : set) {
        System.out.println(i);
    }
}

}
[/code]

输出结果为:
[quote]stu4.equals(stu5) = true
stu4.hash = 3541120 ; stu5.hash = 3541120

null
name = stu9 address = neu1 sex = male age = 20
name = stu2 address = neu2 sex = female age = 22
name = stu4 address = neu4 sex = female age = 9
name = stu4 address = neu5 sex = male age = 24
name = stu6 address = neu3 sex = male age = 23
[/quote]

请问为什么会有两个name = stu4的元素,这两个hashcode相等,equal也是true,set中应该是不应该出现两个相同元素的,请帮忙解答一下,不胜感激!

  • 写回答

4条回答 默认 最新

  • ethenjean 2010-12-01 12:58
    关注

    给你个解决办法:
    [code="java"]
    public boolean equals(Stu obj) {

    return (this.name.equals(obj.name));

    }

    [/code]
    改为
    [code="java"]
    public boolean equals(Object obj) {
    Stu o=(Stu)obj;

    return (this.name.equals(o.name));

    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器