繁体   English   中英

集合中的Object.equals方法的后台工作?

[英]Background working of the Object.equals method in the collection?

    HashSet hs = new HashSet();

    hs.add(10);
    hs.add("sum");
    hs.add(10);
    hs.add(12.3d);

    System.out.println(hs); 

1)在上面的代码中,java如何知道当第二个对象传递时,它不需要与第一个对象进行检查。 以及如何知道当第三个对象(即10)通过时,它需要调用Integer类的重写的.equals方法来检查第一个和第三个对象。

2)如果调用对象类的.equals方法,则两个整数都有不同的实例,因此应将两者都添加,但事实并非如此。

我需要集合中.equals方法的后台工作!

equals不会在所有情况下都考虑实例。 基本上,这是一个自定义实现,具体取决于对象的类型,默认情况下,仅比较引用即可。 您可以想象Integer::equals

boolean equals(Object other) { 
  boolean isSameType = other instanceof Integer;
  return isSameType && ((Integer)other).value == value;
}

因此,两个具有相同值的Integer实例将被视为相等。 另外,您正在处理HashSet<T>因此必须考虑int hashCode() ,这应与equals实现一致。

您的HashSet没有使用泛型进行参数化,因此您正确地认为它将被视为HashSet<Object>

但是,当在要添加的元素和集合的当前元素之间进行比较时,将考虑对象类型的 equalshashCode方法。 因此,当您再次添加1010时,它将在执行时使用Integer.equals确定相等性。

HashSet<Object>仅处理引用类型 Object ,这意味着编译器要求HashSet中的所有对象都是Object的实例或扩展Object (当然,所有对象都是对象)。 这与方法的执行无关,但是其行为由实际对象的类型定义。

概括地说,如果我定义:

Object obj = new Integer(10);

我打电话给:

obj.equals(anotherObj);

编译器将确保引用类型Object )具有称为equals的方法,并在运行时执行对象类型Integer )的行为。

Set中的唯一性,在内部通过HashMap在java中。 每当您创建HashSet对象时,它都会创建一个HashMap对象。 我们在HashMap中知道每个键都是唯一的。 如果key不为null,则它将在键对象即key.hashCode()上调用哈希函数,因此在key.hashCode()返回hashValue之后,它看起来像是-int hash = hash(hashValue) ,现在,它适用返回hashValue转换为自己的哈希函数。 final 哈希值用于查找存储Entry对象的存储桶位置 入口对象像这样存储在存储桶中(哈希,键,值,存储桶索引)。 因此,我们遍历链表, 使用keys.equals()比较每个条目中的键,直到返回true。 然后返回相应的入口对象Value,即,如果两个对象的哈希值相同,则将调用equals方法以验证其是否相同。 如果没有,则对象将找到它在存储桶(链接列表)中的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM