equals()和hashCode()方法的覆盖在TreeMap中不是必须的,但在HashMap和LinkedHashMap中则是必须的。
TreeMap
使用Comparable
或Comparator
接口提供的实现来对使用自定义类作为Map
的Key
进行操作。这个说法正确吗?
equals()和hashCode()方法的覆盖在TreeMap中不是必须的,但在HashMap和LinkedHashMap中则是必须的。
TreeMap
使用Comparable
或Comparator
接口提供的实现来对使用自定义类作为Map
的Key
进行操作。这个说法正确吗?
TreeMap
内部仅使用 compare
函数来处理键。
containsValue
方法内部使用 equals
。因此,需要重新定义值的 equals
,而不是键的。
HashMap
和 LinkedHashMap
在键上内部使用 equals
和 hashCode
。因此,您需要为您的键类重新定义它们。对于 TreeMap、HashMap
和 LinkedHashMap
也使用 equals
来处理值。因此,需要重新定义值的 equals。
equals
保持一致,如果这个排序映射要正确实现Map
接口。(有关与equals
一致的精确定义,请参见Comparable
或Comparator
。)这是因为Map
接口是根据equals
操作定义的,但是排序映射使用其compareTo
(或compare
)方法执行所有键比较,因此在这种方法被视为相等的两个键在排序映射的角度来看是相等的。即使排序映射的排序与equals
不一致,它的行为也是明确定义的;它只是没有遵守Map
接口的一般约定。强调我的。
根据最后一句话,如果您没有为键定义equals
方法,则TreeMap
将是完全功能的,但这将违反Map
接口的契约。例如,{{link1:Map.containsKey
}} 契约如下:
因此,如果您使用具有不一致如果此映射包含指定键的映射,则返回
true
。更正式地说,仅当此映射包含键k
的映射(使得(key==null ? k==null : key.equals(k))
)时,才返回true
。
equals
实现的键的TreeMap
,则会出现错误。如果您将映射传递给某些假定传递的映射遵循合同的方法,则该方法可能无法正常工作。hashCode()
和equals()
。如果这个映射也是一个SortedMap
,那么我还会重写compare()
或者实现一个Comparator
(在这两种情况下,比较必须与equals()
一致,这意味着比较的结果必须在实际相等的元素之间返回0
)。是的,我是正确的(如果我错了,请纠正我)...请检查以下代码 -
In this following code `equals()` and `hashCode()` is never get called , so in `TreeMap` does these never gets called in `TreeMap` ?? Or something wrong I have Done ???? its never printing `inside hashCode()` `inside equals()`
package Map;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class HashCodeEqualsTester {
public static void main (String[] args){
Car car1 = new Car("788");
Driver driver1 = new Driver("Kevin");
Car car2 = new Car("656");
Driver driver2 = new Driver("Bob");
Car car3 = new Car("343");
Driver driver3 = new Driver("Stuart");
Map<Car, Driver> myMap = new TreeMap<Car, Driver>();
// Map<Car, Driver> myMap = new LinkedHashMap<Car, Driver>();
// Map<Car, Driver> myMap = new HashMap<Car, Driver>();
// try to run these 3 one at a time and see how does it behave
myMap.put(car1, driver1);
myMap.put(car2, driver2);
myMap.put(car3, driver3);
System.out.println(myMap);
}
}
class Car implements Comparable{
private String carNumber;
public Car (String carNumber){
this.carNumber = carNumber;
}
public String getCarNumber() {
return carNumber;
}
public void setCarNumber(String carNumber) {
this.carNumber = carNumber;
}
public String toString(){
return ("Car Number : " + carNumber);
}
public int hashCode(){
System.out.println("Inside hashCode()");
int hashCode = 1;
hashCode = hashCode * this.getCarNumber().hashCode();
System.out.println("For Car Number : " + this.getCarNumber() + " hashcode is : " + hashCode);
//return hashCode;
return 1000;
}
public boolean equals(Object o){
System.out.println("Inside equals()");
if (!(o instanceof Car)) {
return false;
} else {
Car car = (Car) o;
return (this.getCarNumber().equalsIgnoreCase(car.getCarNumber()));
}
}
public int compareTo(Object o) {
Car car = (Car) o;
return (this.getCarNumber().compareTo(car.getCarNumber()));
}
}
class Driver {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return (this.getName() + " ");
}
public Driver(String name){
this.name = name;
}
}