2012-03-10 45 views
1

我想在模拟中存储有关人员对象的信用历史信息。我应该使用什么来跟踪java中可变对象的细节

我想使用HashMap<Person, CreditHistory>,但java API说我应该警惕使用HashMaps跟踪可变对象(如我的程序中的信用历史记录)。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html

是否有更好的结构吗?

+2

该文档有时会说怪异的东西......除非您计划修改密钥,否则这不是真的。可以修改所有值。 – Jon 2012-03-10 00:50:05

+0

只是发送信用信息给我,我会跟踪它。 – nsfyn55 2012-03-10 01:11:12

回答

5

注意事项仅适用于密钥 - 如果更改了影响hashCode()equals()行为的密钥的任何内容,则会中断哈希映射,并且将无法再次找到该密钥。对于这些值,你可以自由地做任何你想做的事情。如果修改一个值会改变你的地图的语义,那就取决于你了。

+0

我不得不修改Person对象。我应该重写Object()中的hashCode()函数来返回该人的String uniqueID吗?或者,或者,我可以使用String uniqueID作为地图的关键字 – bernie2436 2012-03-10 01:17:52

+0

使用'uniqueId'作为关键听起来像是正确的调用。 – 2012-03-10 02:21:30

+0

通常,使用复杂的可变对象作为键不是一个好主意。使用_value_唯一标识符的不可变变量。就你而言,如果某个人的uniqueID不能改变,那么这是一个很好的候选人。 – 2012-03-10 05:01:46

1

除非您计划经常修改Person对象,否则您应该没问题。

API说要小心使用可变对象作为键。这是因为当密钥更改时严格的逻辑可能会失败。如果你编程正确,你会没事的。

如果你只是改变CreditHistory对象,这是最好的结构和(在我看来)最容易使用。

相关问题