我有以下TreeMap:
TreeMap<String, Integer> distances = new TreeMap<String, Integer>();
它包含两个字符串,“Face”和“Foo”,具有适当的值,例如:
System.out.println(distances);
收率:
{Face=12, Foo=2}
但是,distances.get(Face)
会返回null
,即使distances.get(Foo)
正确返回2.之前,distances.get(Face)
有效,但由于某种原因,它停止了工作。注意我在为两个键调用get()之前打印出地图 right ,所以我没有意外地将Face的值更改为null。有没有人遇到过这个问题?有什么我能做的吗?我只是想弄清楚如何调试这个问题,我度过了一段可怕的时光。
注意:在实际代码中,我实际上并没有使用字符串,而是使用不同的对象,因此它是:TreeMap<Object, Integer>
。所以它不仅仅是变量名与文字字符串的混淆。
SECOND注意:对于我正在使用的对象hashcode()
和equals()
的实现,我也非常有信心。 (另外,如果我的实现不正确,它不会从一开始就不起作用吗?而不是停止随机工作?)
答案 0 :(得分:5)
回复您的说明:每个人都在询问您是否正确覆盖了equals()
和hashcode()
- 这很重要,是的。但这是一个TreeMap
,这意味着您还必须关心比较 - 无论您使用的是Comparable
个对象还是外部的Comparator
,您需要确保您的比较是一致(您的对象是否可变?)并且它们与您的equals()
方法一致。
顺便提一下,当你在原始问题中说你正在使用String
个对象时,你自己也是一种伤害 - 字符串是不可变的,他们的比较方法在这里没有考虑,所以这个问题根本不同;既然我们知道你自己的代码,那么可能的解决方案领域就更广泛。
答案 1 :(得分:0)
您确定值“Foo”和“Face”都是Strings
吗?
此代码适用于我:
TreeMap<String, Integer> map = new TreeMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
System.out.println(map);
System.out.println(map.get("a"));
System.out.println(map.get("b"));
输出{a = 1,b = 2} 1 2。
在您的情况下,如果Foo
和Face
不是String
,则地图不能将它们用作查找的键。也许您正在使用get(Face)
,您应该使用get("Face")
?
答案 2 :(得分:0)
您是否将字符串文字"Face"
与名为Face
的变量混淆了?如果您真的使用distances.get(Face)
,这意味着您正在尝试传入变量Face
,并且您将null
退出并不奇怪(除非这是一个字符串您之前已添加到地图中的内容的变量。)
而是尝试distances.get("Face")
。如果可行,则表示"Face"
是您用作键的字符串 - 与可能包含字符串的变量Face
不同。
答案 3 :(得分:0)
@smessing您是否在您的类上正确实现了Foo和Face所属的对象的equals
和hashcode
方法?
如果要将对象存储在List,Map或Set中,则需要实现equals和hashCode,以便它们遵守文档中指定的标准合同。
如果没有正确完成这些操作,get操作可能会导致意外的结果,如上所述。
答案 4 :(得分:0)
如果要为Face分配其他参考对象/变量,请检查它是否变为空。
如果您的face对象指向另一个对象的引用而另一个对象将其设置为null,则Face也将变为null。