为什么 Java 集合不能直接存储基元类型?

2022-08-31 08:03:55

Java集合只存储对象,不存储基元类型;但是我们可以存储包装类。

为什么有这种限制?


答案 1

这是一个Java设计决策,有些人认为这是一个错误。容器需要对象和基元不是从对象派生的。

这是 .NET 设计人员从 JVM 中学习并实现值类型和泛型的一个地方,以便在许多情况下消除装箱。在 CLR 中,泛型容器可以将值类型存储为基础容器结构的一部分。

Java选择在编译器中添加100%的通用支持,而不受JVM的支持。JVM就是这样,不支持“非对象”对象。Java泛型允许你假装没有包装器,但你仍然支付拳击的性能代价。这对于某些类别的程序很重要。

拳击是一种技术上的妥协,我觉得这是实现细节泄漏到语言中。自动装箱是不错的语法糖,但仍然是性能损失。如果有的话,我希望编译器在自动装箱时警告我。(据我所知,现在可能是我在2010年写了这个答案)。

关于拳击的SO的一个很好的解释:为什么有些语言需要拳击和取消拳击?

对Java泛型的批评:为什么有些人声称Java的泛型实现很糟糕?

在Java的辩护中,很容易回头看和批评。JVM经受住了时间的考验,在很多方面都是一个很好的设计。


答案 2

使实现更容易。由于 Java 基元不被视为对象,因此您需要为每个基元创建一个单独的集合类(无需共享模板代码)。

当然,你可以这样做,只要看看GNU TroveApache Commons PrimitivesHPPC

除非你有非常大的集合,否则包装器的开销对于人们来说并不重要(当你确实有非常大的原始集合时,你可能想花时间考虑使用/构建一个专门的数据结构)。