散列映射和散列表中的键类型是否存在约束?----访问问题。 我认为是的,我们可以根据需要进行定制。散列映射数据类型是否有任何约束
3
A
回答
2
从技术上讲,没有。通常,您想要使用实现equals()和hashCode()的对象,尽管这不是必需的。如果你不这样做,那么它将使用Object定义的基类实现来比较对象标识。很多时候,这是不恰当的,但有时候很好。
从技术上讲,只要equals()和hashCode()实现中使用的值是不可变的,密钥不需要是不可变的。例如,如果您的Foo类使用字符串“foo”作为它的一部分,那么该值“foo”不得更改。这是因为哈希映射出于效率原因将密钥放入基于hashCode()值的桶中。如果hashCode突然变化,那么散列图就不知道了,而且键将存在于错误的桶中,并且会遇到令人讨厌的bug,因为这样就有可能在地图中存在“重复”对象。希望这是有道理的。
1
几件事情要考虑:
只是对“类型”,则无法使用基本类型。这是Java的语言约束。例如
HashMap<int, Foo>
是无效的,你需要使用HashMap<Integer, Foo>
基础上的方式HashMap的工作,关键要有一个有意义实现的hashCode()和equals()的。它是如何“有意义”取决于你的需要。 Object中的默认实现可能已经满足您的需求,但您需要了解它。
一旦一个对象实例放入Map中作为键,它的hashCode()和equals()应该保持一致。您不应该放入地图,并将对象实例的状态更改为Key,并使hashCode()/ equals()返回不同的值。确保它最简单的方法当然是使用不可变对象作为关键。但是,使用可变对象仍然很好,但在代码中,确保不会改变键的状态。
相关问题
- 1. 归类数据散列映射
- 2. 数据库约束是否映射到业务逻辑
- 3. 泛型类型约束似乎没有约束任何东西
- 4. 类型约束的反射
- 5. varchar列的Grails GORM映射约束
- 6. 反映了泛型类型约束
- 7. NHibernate映射约束违规
- 8. ProJNA数据类型映射
- 9. Knockout.js映射没有约束力
- 10. 是否可以将具有相同数据类型的多个列映射到sqoop中的新数据类型?
- 11. 类型参数约束是一个类
- 12. 在约束存在限定的高阶类型映射
- 13. 如何从散列映射
- 14. 密钥是否有散列表映射到内存位置?
- 15. Python中是否存在任何类型的散列表
- 16. 如何将oracle数据类型映射到java数据类型?
- 17. 如何映射对象数据类型
- 18. 检查类型是否为映射
- 19. IBodyModelValidator你是否缺少类型映射?
- 20. 如何映射散列数组?
- 21. 类型约束
- 22. 查找列是否有唯一约束
- 23. 对数据类型的MongoDB约束
- 24. Hacklang - 是否可以使用类型常量的类型约束?
- 25. 如何防止使用类型约束的循环多项式散列函数?
- 26. 类型参数约束
- 27. 射型家庭和约束
- 28. 映射列类型Slick 3.1.1
- 29. 是否有可能“混入:附加类型约束
- 30. Symfony2:类型约束是否与Doctrine ORM列类型定义结合使用?
必须实现'hashCode()'和'equals()'有意义。 – jlordo 2013-03-27 01:02:50
键应该是不可变的,否则会遇到奇怪的问题。 – 2013-03-27 01:04:35