pra*_*_kv 5 java object treemap
class Point{
int x, y, l;
Point(int x, int y, int l){
this.x =x;
this.y =y;
this.l=l;
}
@Override
public int hashCode() {
return y;
}
@Override
public boolean equals(final Object obj) {
if(this == obj) return true;
if(!(obj instanceof Point)) return false;
Point p = (Point) obj;
return this.x == p.x && this.y == p.y;
}
}
TreeMap<Point,Integer> sortedMap = new TreeMap<>((p1, p2)-> p1.l-p2.l);
sortedMap.put(new Point(4,5,0),0);
sortedMap.put(new Point(5,5,0),6);
System.out.println(sortedMap.size()); -> Output: 1
System.out.println((new Point(4,5,0)).equals(new Point(5,5,0))); -> Output -> False.
Run Code Online (Sandbox Code Playgroud)
我在类中重载了hashcode,equals方法.我认为put方法应该使用equals方法来确定是否退出相同的对象.但它没有按预期工作.
我不知道为什么我的hashMap大小为1.如果我理解hashmap错误地工作,请告诉我.帮我识别一下这段代码中的错误?
Jon*_*eet 11
您TreeMap正在Point按l部分比较值(无论那是什么意思).这就是你的代码的这一部分:
new TreeMap<>((p1, p2)-> p1.l-p2.l);
Run Code Online (Sandbox Code Playgroud)
您创建的两个点具有相同的l值(0),因此它们被视为相等...所以第二次调用put替换现有条目.TreeMap不使用equals,并hashCode在所有.
从文档:
请注意,如果此有序映射要正确实现Map接口,则树映射维护的顺序(如任何有序映射)以及是否提供显式比较器必须与equals一致.(有关与equals一致的精确定义,请参见Comparable或Comparator.)这是因为Map接口是根据equals操作定义的,但是有序映射使用compareTo(或compare)方法执行所有键比较,因此从排序映射的角度来看,通过此方法被视为相等的键是相等的.即使排序与equals不一致,也可以很好地定义有序映射的行为.它只是不遵守Map接口的一般合同.
您的比较与此不符equals,这就是您看到违反Map合同的结果的原因.
TreeMap只使用提供的Comparator(或可用的自然顺序)来确定相等性,因此equals并hashCode没有区别.
在你的情况下,两者都Point具有相同的l值,因此它们被认为是相同的Comparator.
在确定密钥的顺序(和相等)时,您可以修改您的Comparator所有属性(和).lxy
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |