[英]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>
。
但是,当在要添加的元素和集合的当前元素之间进行比较时,将考虑对象类型的 equals
和hashCode
方法。 因此,当您再次添加10
和10
时,它将在执行时使用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.