猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
为什么Java Collections不能直接存储Primitives类型?
Java集合只存储对象,而不是基本类型; 但是我们可以存储包装类。
为什么这个约束?
慕尼黑5688855
浏览 391
回答 3
3回答
青春有我
这是一个Java设计决策,有些人认为是错误的。容器需要对象和基元不是从Object派生的。这是.NET设计人员从JVM学到的一个地方,并实现了值类型和泛型,以便在许多情况下消除拳击。在CLR中,通用容器可以将值类型存储为底层容器结构的一部分。Java选择在没有JVM支持的情况下在编译器中100%添加泛型支持。JVM就是这样,不支持“非对象”对象。Java泛型允许你假装没有包装器,但你仍然支付拳击的性能价格。这对于某些类程序来说非常重要。拳击是一种技术妥协,我觉得这是实施细节渗透到语言中。Autoboxing是很好的语法糖,但仍然是性能损失。如果有的话,我希望编译器在自动装箱时警告我。(据我所知,现在可能,我在2010年写了这个答案)。关于拳击的一个很好的解释:为什么有些语言需要拳击和拆箱?对Java泛型的批评: 为什么有人声称Java的泛型实现很糟糕?在Java的辩护中,很容易回顾和批评。JVM经受住了时间的考验,在很多方面都是一个很好的设计。
0
0
0
繁华开满天机
使实施更容易。由于Java基元不被视为对象,因此您需要为每个基元创建单独的集合类(无需共享的模板代码)。你可以这样做,当然,只需看看GNU Trove,Apache Commons Primitives或HPPC。除非你有非常大的集合,否则包装器的开销对于人们来说并不重要(当你确实拥有非常大的原始集合时,你可能需要花费精力来研究为它们使用/构建专用数据结构)。
0
0
0
浮云间
这是两个事实的组合:Java原始类型不是引用类型(例如,int不是一个Object)Java使用类型擦除引用类型做泛型(例如,a List<?>实际上是List<Object>在运行时)由于这两者都是正确的,因此通用Java集合无法直接存储基本类型。为方便起见,引入了自动装箱以允许原始类型自动装箱作为参考类型。不过不要误会,集合仍然存储对象引用,无论如何。这可以避免吗?也许。如果a int是a Object,则根本不需要盒子类型。如果没有使用类型擦除来完成泛型,那么原语可以用于类型参数。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
Java
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续