覆盖toString方法并避免冲突

时间:2013-02-06 04:21:17

标签: java hash hashmap collision tostring

我想知道我是否覆盖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对象时显示名称,但是如果我将它们全部存储在HashMap中,那么当两个不同的同名学生(不同的gpa)将导致我出现问题时。 有什么可以避免碰撞而不修改或对原始Student类进行最小修改?

5 个答案:

答案 0 :(得分:1)

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

toString()与HashMap的行为无关。作为HashMap中键的对象的唯一两个重要方法是equals(Object)hashcode()

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

答案 1 :(得分:0)

如果要在基于散列表的集合(如HashMap,HashSet等)中使用您的类,则应该正确覆盖并实现hashCodeequalstoString与HashMap无关。 / p>

答案 2 :(得分: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 + "]";
    }
}

答案 3 :(得分:0)

java中hashCode的默认实现是将所有变量的值混合在一起并散列。因此,toString是什么并不重要。

答案 4 :(得分:0)

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

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