我需要一个基于密钥的Someclass值。键可以是字符串,布尔值或其他对象,这就是我使用Object作为键的原因。但是当对象是一个字符串时,我有一个问题。我有两个对象的字符串,它是等于,但它应该返回不同的值,因为它是一个不同的对象。
我的代码:
Object k = new String("action");
Object l = new String("action");
Hashtable<Object,SomeClass> map = new Hashtable<Object, SomeClass>();
map.put(k,anObject1);
map.put(l,anObject2);
map.remove(k); // it is removing both with k and l.
当我检查两个对象的hashCode()时,它返回相同的值,这最终不是我想要的。
这有什么解决方案吗?我是否需要创建一个覆盖对象的Equals()的新类?但是,仍然是hashCode。 :(问题是我需要一个hashCode,为不同的Object返回不同的值。
编辑: 我这样做是因为我需要根据字符串的内容执行不同的操作,但操作将因map中使用键返回的值而不同。
更新: 好的,这就是为什么我需要这个奇怪的东西。
我有一个玩家实例和3个陆地实例。所以我希望玩家能够耕种land1,land2,land3。如果玩家想要耕种土地,那个土地会形成一个正在运行的线程,告诉玩家移动到位置X
,并按对象{{action
和wait()
执行作业1}},当另一个线程action
这个线程按对象notify
时,土地就会自行修改。然后,玩家根据对象action
制作动画。我有action
和'ArrayList action`来拥有它。也许你可以阅读我关于这个here的其他问题。
所以我想让动作取消。我通过传递ArrayList<Position> destination
对象来实现它。我有一个按钮,显示每个动作,每个按钮将取消该动作。我也在这里传递了action
。因此,当我点击按钮时,土地将获得action
。问题是我无法通过notify
使ArrayList<Position>
删除目标,因为它不知道索引在哪里。我是Java的新手,但是我一直在使用C ++,所以我考虑使用Hashtables,因为它的O(1)与C ++ O(log n)不同,并且因为我当前代码没有太多变化,所以很方便。 / p>
可以理解吗?
答案 0 :(得分:5)
您可以使用IdentityHashMap,但如果您可以解释一下您在这里尝试做什么,可能会有所帮助。这不是一个非常普遍的要求,除非你有一些很好的理由要做到这一点,否则你可能还有其他更好的事情。
顺便说一下,Map
只能为一个键保存一个值。因此,在您第二次拨打map.put
后,您放入的第一个值已经消失。
修改强>
好的,我已经阅读了你的解释......好吧,我还不完全清楚你在做什么。这是我对你所说的最好的猜测:
String
。String
&#34;犁&#34;的3个不同实例。到了3个不同土地的Position
。如果这个(或类似的东西)是你想要做的,那么这就是我的想法:
String
不应该是唯一的......&#34;犁&#34;是&#34;犁&#34;,无论它做什么土地。 唯一的是像&#34; plow&#34;等动作的组合。以及要采取行动的土地。enum
或其他类似代表行为类型可能会很好。Action
类应包含&#34;操作类型&#34;和Position
。当您点击取消Action
时,您就可以获得所需的数据。答案 1 :(得分:2)
String类重写equals()和hashCode(),使得具有相同字符的两个字符串具有相同的hashCode()并且相等。但是Object类本身有一个equals()方法, never 为两个不同的对象返回true。实际上没有必要(也不可能!)哈希码是唯一的;他们只需要很好地分布在各种可能的价值观中。
所以无论如何:字符串不适合你的要求,我同意;但是没有覆盖equals()和hashCode()的任何其他类的对象应该没问题。
答案 2 :(得分:1)
这是Hashmap的语义:密钥是唯一的,密钥域中的每个值都映射到Hashmap中的最多一个值。
将它想象成一个数组,只是数组不是由数字索引而是由任意对象索引。在数组中的同一索引处不能有多个不同的值。
答案 3 :(得分:0)
您可以考虑创建自己的类来表示Key,并通过一些唯一标识符定义您自己的哈希码。也许使用AtomicLong