当前位置: 首页 > 面试题库 >

hash code 的hash code 和等于

龙永逸
2023-03-14
问题内容

请在Hashset中澄清我的疑问。考虑以下代码,

class Person
{
    String name;

    Person(String n)
    {
        name=n; 
    }
    public String getName()
    {
        return name;   
    }

    @Override
    public boolean equals(Object arg0) {

        System.out.println("in equals");

        Person obj=(Person)arg0;

        System.out.println("1st "+getName());
        System.out.println("2nd "+obj.getName());

        if(this.getName().equals(obj.getName()))
        {
                return true;
        }
        return false;
    }


    @Override
    public int hashCode() {

        System.out.println("in hash code");
        System.out.println(" value is "+Integer.valueOf(name.charAt(0)));
        return Integer.valueOf(name.charAt(0));
    }
}

在主要我有以下代码

Person obj1=new Person("bcd");

Person obj2=new Person("cde");

Person obj3=new Person("abc");

Person obj4=new Person("abc");

现在,如果我将这些对象添加到哈希集中

Set<Person> sset=new HashSet<Person>();

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj3);

我得到这个输出

in hash code                                                                      
value is 98    
in hash code   
value is 97    
in hash code    
value is 99    
in hash code    
value is 97  
in equals  
1st abc     
2nd abc

问题1 :为什么equals()函数仅被调用一次以检查obj3和obj4?为什么不检查其余对象?

问题2 :如果答案是因为它们都具有相同的哈希码,则仅将调用equals,那么为什么下面的代码不调用equals

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj4);

输出是:

in hash code  
value is 98  
in hash code   
value is 97   
in hash code   
value is 99   
in hash code  
value is 97

即使将两个相同的对象添加到具有相同哈希码的哈希集中,也不会进入equals()方法

问题3 :我迭代了上面的值并打印了内容,但是没有调用哈希码或相等值。什么时候重写哈希码和equals方法真的有用吗?

问题4 :什么时候会hashCode()equals()被称为?


问题答案:
  1. equals如有hashCode不同,无需致电。
  2. 无需致电hashCodeif (obj1 == obj2)
  3. 不需要hashCode和/或equals仅迭代-您没有比较对象
  4. 需要区分对象时。


 类似资料:
  • 该属性返回一个整数,表示数值的哈希码。 语法 (Syntax) num.hashcode 例子 (Example) void main() { int n = 5000; print(n.hashCode); } 它将产生以下output - 成功执行代码后会显示以下输出。 5000

  • 问题内容: 我有一个关于集合和方法的快速问题。我有一个对象,并且我要向其中添加对象,然后再添加对象,然后使用来检查它是否存在。 我有2个不同的对象,每个对象使用我对hashCode方法的实现产生一个不同的hashCode,如下例: 特定运行的hashCode为:76126352和76126353(对象在一个属性中仅相差一位数字)。 即使hashCodes不同,contains方法对于这些对象也将返

  • 问题内容: 我很好奇,这里的人们对使用 / 实施/有什么看法 ?比编写自己的方法更好的做法吗?它与Hibernate配合使用是否很好?你怎么看? 问题答案: commons / lang构建器很棒,我使用它们已有多年了,而没有明显的性能开销(带有和不带有hibernate状态)。但正如Alain所写,番石榴的方法更好: 这是一个示例Bean: 这是用Commons / Lang实现的equals(

  • 描述 (Description) java.lang.reflect.Method.hashCode()方法返回此Method的哈希码。 哈希码与底层方法声明类名的哈希码相同。 声明 (Declaration) 以下是java.lang.reflect.Method.hashCode()方法的声明。 public int hashCode() 返回值 (Returns) 此对象的哈希码值。 例子

  • 描述 (Description) java.lang.reflect.Field.hashCode()方法返回此Field的哈希码。 这被计算为底层字段声明类名及其名称的异或或哈希码。 声明 (Declaration) 以下是java.lang.reflect.Field.hashCode()方法的声明。 public int hashCode() 返回值 (Returns) 此对象的哈希码值。

  • 描述 (Description) java.lang.reflect.Constructor.hashCode()方法返回此Constructor的哈希码。 哈希码与底层构造函数声明类名的哈希码相同。 声明 (Declaration) 以下是java.lang.reflect.Constructor.hashCode()方法的声明。 public int hashCode() 返回值 (Retu

  • 描述 (Description) java.math.MathContext.hashCode()返回此MathContext的哈希码。 声明 (Declaration) 以下是java.math.MathContext.hashCode()方法的声明。 public int hashCode() 覆盖 (Overrides) Object类中的hashCode。 参数 (Parameters)

  • 描述 (Description) java.math.BigInteger.hashCode()返回此BigInteger的哈希码。 声明 (Declaration) 以下是java.math.BigInteger.hashCode()方法的声明。 public int hashCode() 覆盖 (Overrides) Object类中的hashCode。 参数 (Parameters) NA