0

我想知道我是否覆盖了从对象返回实例之一的 toString 方法,那么它是否更有可能导致冲突?例如,

class Student{
   private String name;
   private double gpa;
   public Student(String name, double gpa){
      this.name = name;
      this.gpa = gpa;
   }
   public String toString(){
      return name;
   }
}

所以问题是我想在打印Student对象时显示名称,但是当两个具有相同名称(不同gpa)的不同学生将它们全部存储在HashMap中时会给我带来问题。在不修改或对原始 Student 类进行最小修改的情况下避免碰撞的替代方法是什么?

4

5 回答 5

1

鉴于您的标签,您似乎在谈论 HashMap 中的哈希冲突?

toString()与HashMap的行为无关。对于可能成为 HashMap 中键的对象,仅有的两个重要方法是equals(Object)hashcode()

此外,HashMap 是冲突安全的,因此您无需关心哈希冲突。

于 2013-02-06T04:26:14.163 回答
0

如果你想在基于哈希表的集合(如 HashMap、HashSet 等)中使用你的类,你应该重写并正确实现hashCode。与 HashMap 无关。equalstoString

于 2013-02-06T04:46:03.017 回答
0

HashMap 内部存储在一个表中。键用于标识表索引,因此键类覆盖 hashCode() 非常重要,因为 hashCode 值将用于确定表索引。如果两个不同的键导致相同的哈希码或不同的哈希码映射到同一个表索引,就会发生冲突,这意味着两个不同的条目指向同一个桶位置。如果发生冲突,前一个条目将链接到新的(键,值),因此链表开始。

如果你希望你的学生类被用作键,它覆盖 hashCode() 很重要。尝试确保 hashCode() 返回唯一值以最大程度地减少冲突。如果两个学生有相同的名字,可能你也应该依赖一些 id。在这种情况下,需要使用 name 和 Id 来计算 hashCode。还要确保覆盖 equals(),这在发生冲突时很重要,key.equals() 将有助于识别链表中的键。

于 2013-02-08T05:19:41.283 回答
0

java中的默认实现hashCode是将其所有变量的值混合在一起并对其进行哈希处理。所以,不管是什么toString

于 2013-02-06T05:33:33.163 回答
0

也许这会有所帮助:

class Student{
    private static AtomicInteger nextUniqueID = new AtomicInteger (0);

    private final int uniqueID = nextUniqueID.getAndIncrement ();
    private String name;
    private double gpa;
    public Student(String name, double gpa){
        this.name = name;
        this.gpa = gpa;
    }
    public String toString(){
        return name + " [" + uniqueID + "]";
    }
}
于 2013-02-06T05:24:22.463 回答