为什么Map中的键必须是对象而不是基元,为什么我不能将原始类型用作映射中的键

时间:2013-11-22 07:31:40

标签: java

我有一张地图:Map abc = new HashMap()。为什么我只能将对象用作键而不是原语?

2 个答案:

答案 0 :(得分:2)

在java中,基元和对象/类之间存在很大差异。

当您定义一个以Object为参数的方法时,您也可以传递一个字符串或AbstractSingletonFactoryFacade。但是你不能传递原语。没有办法抽象出多个原语。这并没有随着泛型而改变。

可以做的是定义接受(并返回)各种基元的单独接口。虽然这对于像List这样只有一个类型参数的东西是可行的,但对于具有两个类型参数的Map,最终会有81个接口(8 primitive types + Object平方)。这不值得麻烦。

当然,大多数时候这并不重要,因为Autoboxing会在大多数情况下使问题隐藏起来。

答案 1 :(得分:1)

至于原因:Map的实现需要Object键(带有equals()函数)来(有效地)排序/存储您的值以便快速检索。基元没有equals()函数,因此不适合该任务。 (这基本上是@MadProgrammer所建议的,除了equals is used in the defintion, and hashCode is just optional for possible implementations)。

没有理由不能编程这个,但实际上你可以说原语有最简单的相等和hashCodes来计算!这可能是Narendra Pathai所建议的TIntArrayList所做的。正如Jens Schauder所述:这不值得麻烦,也因为自动装箱会在大多数时候隐藏你的问题。