Java Hashtable <object,someclass =“”>,如果键是字符串?如果字符串相同,它将使用相同的字符串</object,>删除所有值

时间:2011-04-11 16:54:45

标签: java string hashtable equals hashcode

我需要一个基于密钥的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,并按对象{{actionwait()执行作业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>

可以理解吗?

4 个答案:

答案 0 :(得分:5)

您可以使用IdentityHashMap,但如果您可以解释一下您在这里尝试做什么,可能会有所帮助。这不是一个非常普遍的要求,除非你有一些很好的理由要做到这一点,否则你可能还有其他更好的事情。

顺便说一下,Map只能为一个键保存一个值。因此,在您第二次拨打map.put后,您放入的第一个值已经消失。

修改

好的,我已经阅读了你的解释......好吧,我还不完全清楚你在做什么。这是我对你所说的最好的猜测:

  • 您有一个名为&#34; plow&#34;的动作,表示为String
  • 你告诉玩家&#34;犁&#34; 3个不同的土地。
  • 您希望能够取消某个地方的行动而不取消其他地方的行动。
  • 要执行此操作,您要尝试映射String&#34;犁&#34;的3个不同实例。到了3个不同土地的Position

如果这个(或类似的东西)是你想要做的,那么这就是我的想法:

  • 行动String不应该是唯一的......&#34;犁&#34;是&#34;犁&#34;,无论它做什么土地。 唯一的是像&#34; plow&#34;等动作的组合。以及要采取行动的土地。
  • 鉴于此,&#34;犁&#34;应被视为类似&#34;行动类型&#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