具有唯一性检查的HashMap

tex*_*nic 5 java exception hashmap

我有一个包含几个键值列表的类.每个键(在列表中)应该是唯一的,所以我使用HashMap.当代码中的某个地方我向列表添加一个新项目时,我正在使用HashMap put(K, V).如果尝试添加具有已存在密钥的项目,我希望我的代码抛出异常.并且,因为这样的添加是在程序的许多地方执行的,所以我想避免在每个地方添加检查.所以应该是列表类本身不允许替换现有的键值对.

我想用我自己的一个扩展HashMap类,它将执行这样的检查并抛出异常.但是,HashMap put不会抛出异常,所以我也不能这样做.

实现这种行为的好方法是什么?我准备好用更好的东西替换HashMap,但我需要它在添加和检索项目时都要快.

更新: 感谢所有许多好建议.由于我是一个完整的Java新手,我现在需要学到很多才能选择最好的一个:)无论如何,我很感激在午餐休息时间有这么多选择!

Isa*_*aac 8

您可以使用Commons Collections,例如:

Map map = MapUtils.predicatedMap(new HashMap(), PredicateUtils.uniquePredicate(),
             null);
Run Code Online (Sandbox Code Playgroud)

这将创建一个Map实例,当您在相同的密钥已存在时尝试插入键值对时将抛出异常.

当然,您可以通过构建自己的Predicate实例并使用它来代替它来自定义此行为PredicateUtils.uniquePredicate().你自己Predicate可以做任何你需要它做的事情,所以例如,它可能抛出一个不同于默认抛出的异常类型的异常uniquePredicate().


Mik*_*378 7

我不会扩展HashMap类,因为在这种情况下,它会导致违反Liskov替换原则,因为您改变了基类方法的行为.

相反,我会使用组合:

创建您的CustomHashMap类实现Map接口和HAVING HashMap字段.并重新声明HashMap类中存在的每个方法,为每个方法添加一个委托HashMap除了put()方法=>抛出异常(如果entry已经存在).


Ale*_*ien 0

您可以抛出一个扩展 RuntimeException 的异常。

  • 嘿,你这个投反对票的人,我的回答是有效的。给出你投反对票的理由 (2认同)