Java TreeMap随机停止正确返回值

Java TreeMap随机停止正确返回值,java,treemap,Java,Treemap,我有以下树形图: TreeMap<String, Integer> distances = new TreeMap<String, Integer>(); 收益率: {Face=12, Foo=2} 但是,distance.getFace返回null,即使distance.getFoo正确地返回2。以前,distance.getFace可以工作,但由于某种原因,它停止了工作。注意,我在为两个键调用get之前打印了映射,所以我没有意外地将Face的值更改为null。还有

我有以下树形图:

TreeMap<String, Integer> distances = new TreeMap<String, Integer>();
收益率:

{Face=12, Foo=2}
但是,distance.getFace返回null,即使distance.getFoo正确地返回2。以前,distance.getFace可以工作,但由于某种原因,它停止了工作。注意,我在为两个键调用get之前打印了映射,所以我没有意外地将Face的值更改为null。还有其他人遇到过这个问题吗?有什么我能做的吗?我只是想弄明白如何调试这个问题,这段时间过得很糟糕

注意:在真正的代码中,我实际上并没有使用字符串,而是使用一个不同的对象,所以它是:TreeMap。因此,这不仅仅是变量名与文字字符串的混淆


第二个注意事项:我还对我正在使用的对象的hashcode和equals的实现非常有信心。另外,如果我的实现不正确,它从一开始就不工作吗?不要停止随机工作?

您确定值Foo和Face都是字符串吗

此代码适用于我:

        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. 二,


在您的情况下,如果Foo和Face不是两个字符串,则映射不能将它们用作查找的键。也许您正在使用getFace,而您应该在其中使用getFace?

您确定值Foo和Face都是字符串吗

此代码适用于我:

        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. 二,


在您的情况下,如果Foo和Face不是两个字符串,则映射不能将它们用作查找的键。也许您正在使用getFace,而您应该在其中使用getFace?

您是否将字符串文字Face与名为Face的变量混淆了?如果您实际使用的是distance.getFace,这意味着您正试图传入一个变量面,并且返回null也就不足为奇了,除非这是一个字符串变量,您之前已将其内容添加到映射中


相反,请尝试distance.getFace。如果这样做行得通,那就意味着面是用作键的字符串-这与可能包含字符串的变量面不同。

是否将字符串文字面与名为面的变量混淆?如果您实际使用的是distance.getFace,这意味着您正试图传入一个变量面,并且返回null也就不足为奇了,除非这是一个字符串变量,您之前已将其内容添加到映射中


相反,请尝试distance.getFace。如果这样做行得通,那就意味着Face是您正在用作键的字符串-这与可能包含字符串的变量Face不同。

@smessing您是否在对象Foo和Face所属的类上正确实现了equals和hashcode方法? 当您想要在列表、映射或集合中存储对象时,需要实现equals和hashCode,以便它们遵守文档中指定的标准约定。
如果这些操作没有正确执行,get操作可能会导致您提到的意外结果。

@smessing您是否在对象Foo和Face所属的类上正确实现了equals和hashcode方法? 当您想要在列表、映射或集合中存储对象时,需要实现equals和hashCode,以便它们遵守文档中指定的标准约定。
如果这些操作没有正确完成,get操作可能会导致您提到的意外结果。

回应您的注意:每个人都在问您是否正确重写了equals和hashcode-这很重要,是的。但这是一个树形图,这意味着您还必须关心比较-无论您使用的是可比较对象还是外部比较程序,您都需要确保您的比较是一致的。您的对象是可变的吗?它们与你的equals方法一致


顺便说一句,当你在最初的问题中说你在使用字符串对象时,你对自己造成了伤害-字符串是不可变的,它们的比较方法在这里没有被考虑,所以问题是根本不同的;既然我们知道了您自己的代码,那么可能的解决方案的范围就更广了。

对于您的注释,每个人都在问您是否正确地覆盖了equals和hashcode,这很重要,是的。但这是一个树形图,这意味着您还必须关心比较-无论您使用的是可比较对象还是外部比较程序,您都需要确保您的比较是一致的。您的对象是可变的吗?它们与你的equals方法一致


顺便说一句,当你在最初的问题中说你在使用字符串对象时,你对自己造成了伤害-字符串是不可变的,它们的比较方法在这里没有被考虑,所以问题是根本不同的;既然我们知道了涉及到您自己的代码,那么可能的解决方案的范围就更广了。

如果您正在使用其他引用对象/变量指定面,请检查该值是否变为空


如果您的face对象指向另一个对象的引用,而另一个对象将其设置为null,则face也将变为null。

如果您使用其他引用对象/变量指定face,请检查它是否变为null


如果您的face对象指向另一个对象的引用,而另一个对象将其设置为null,则face也将变为null。

对不起,这需要澄清:在我的实际代码中,我使用的是不同的对象,即我自己的数据类型,因此您所说的混淆不可能是所发生的。对不起,这需要澄清:在我的实际代码中,我使用了不同的对象——我自己的数据类型,所以你所说的混乱不可能是发生了什么。请参阅其他答案的注释,但基本上,我并没有实际使用字符串,我使用的是不同的数据类型。字符串用于说明目的。请参阅其他答案的注释,但基本上,我并没有实际使用字符串,我使用的是不同的数据类型。字符串用于说明。您是否具有对地图的同步访问权限?可能其他线程删除了这些值?不,我没有同步访问,但我认为我不需要同步。基本上,调用是在一个简单的for循环中进行的,该循环在整个映射中进行迭代。它没有做任何事情,只是发出get呼叫进行比较。-1-删除此问题,然后重新开始给出真正的问题,而不是一些关于TreeMap不起作用的废话。并包含足够多的实际代码来给我们提供线索……您是否为树形图分配了一个比较器,或者实际实现的类是否具有可比性?如果是这样,你能确保comparea,b==-1*compareb,a吗?如果你已经为你的对象重写了toString,那么也检查一下。还可以使用distance.containsKey计算出密钥是a不存在还是b存在并映射为Null您是否具有对映射的同步访问权限?可能其他线程删除了这些值?不,我没有同步访问,但我认为我不需要同步。基本上,调用是在一个简单的for循环中进行的,该循环在整个映射中进行迭代。它没有做任何事情,只是发出get呼叫进行比较。-1-删除此问题,然后重新开始给出真正的问题,而不是一些关于TreeMap不起作用的废话。并包含足够多的实际代码来给我们提供线索……您是否为树形图分配了一个比较器,或者实际实现的类是否具有可比性?如果是这样,你能确保comparea,b==-1*compareb,a吗?如果你已经为你的对象重写了toString,那么也检查一下。还可以使用distance.containsKey来确定键是a不存在还是b存在并映射到Null。我已经实现了这两个键,并且非常确信它们不是问题所在。另外,请记住,有一段时间get调用返回正确的值,但在某个时候停止了……我已经实现了这两个函数,并且非常自信它们不是问题所在。另外,请记住,有一段时间get调用会返回正确的值,但在某个时候会停止……我明白您提到字符串对象的意思,对此表示抱歉。至于你的评论,我不确定我是否理解。你的意思是确保你的比较是一致的。。。确保我的对象在我不知道的情况下不会发生变化?如果是这样的话,我也相当确信对象本身不会以任何方式发生变化。这里面的代码是用来在对象之间排序的,但如果有意义的话,不是用来对它们进行操作的。我明白你提到字符串对象的意思,对此很抱歉。至于你的评论,我不确定我是否理解。你的意思是确保你的比较是一致的。。。确保我的对象在我不知道的情况下不会发生变化?如果是这样的话,我也相当确信对象本身不会以任何方式发生变化。这些代码都是用于在对象之间排序的,但如果有意义的话,不用于对它们进行操作。