我的Java教科书说集合的元素,例如ArrayList,不能是原始类型。是否有一个原因?我的意思是Sun的某个人是否决定了这一点,或者是否存在阻碍这样做的障碍?我理解我的例子半答案我的问题,因为ArrayList需要一个对象,而原语不是对象。但后来我想为什么它们也不能有原始类型呢?
答案 0 :(得分:7)
是否存在阻碍做法的障碍 它?
您可以编写近似相同版本的ArrayList
,这些版本是为了存储其中一种非类型类型而量身定制的,例如IntegerArrayList
等等。阻碍这种情况的障碍是,这样的类会爆炸,因为你将原始类型的数量乘以集合类型的数量。为了使标准集合框架易于管理,这被排除了。
为了在语言中更加巧妙地解决这个问题,你需要泛型来允许基本类型作为类型参数,并改善数组和泛型之间的交互。
答案 1 :(得分:5)
存储未包装的基元会使收集代码大大复杂化。然而,使用包装器(Integer
等int
),代码是相当简单的。几年来,Java一直支持“自动装箱”,这意味着如果你给int
预期Integer
,int
就会被Integer
包裹起来你的实例(反之亦然)。
答案 2 :(得分:4)
有一些称为“包装器”的对象代表所有基本类型。例如,有一个名为Integer
的类支持int
。您可以使用原始包装器来保存Collection中的值。
原始类型的问题(至少在Java 5之前)是它们没有从基类Object
类扩展。所有集合都需要为它们使用的所有方法指定一个类 - 它们指定Object
,因为Object
是所有类的基础。
从Java 5开始,您将发现Java将在您需要时隐式地在基元和相应的包装类之间切换。这意味着您可以向集合中添加int
或double
等。 VM将自动将原语包装在包装类中,并将包装器放在Collection中。
答案 3 :(得分:1)
阅读维基百科上的这篇文章。它可能会有所帮助:http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing
在计算机科学中,一种对象类型 (a.k.a.包装对象)是一种数据类型 用于面向对象 编程以包装非对象类型 使它看起来像一个动态的对象。
一些面向对象的编程 语言区分 通常是参考和价值类型 称为对象和非对象 在复杂价值类型的平台上 因为诸如此类的原因而不存在 运行时效率和语法或 语义问题。例如,Java有 原始包装类 对应于每种基本类型: 整数和整数,字符和字符, 漂浮和漂浮等语言 C ++很少或没有概念 参考类型;因此,使用 对象类型没什么意义。
拳击是放置一个的过程 一个对象内的原始类型 原语可以用作 参考对象。例如,列表 可能有一些阵列的方法 可能没有,但列表也可能 要求所有成员都是 动态对象。在这种情况下, 添加的列表功能可能 无法使用简单的数组 数字。有关更具体的例子, 在Java中,LinkedList可以更改它 大小,但数组必须有一个固定的 尺寸。人们可能希望拥有一个 int的LinkedList,但是LinkedList class仅列出对动态的引用 对象 - 它不能列出原语 类型,它们是值类型。
为了避免这种情况,可以装箱 进入整数,这是动态的 对象,然后添加到 LinkedList of Integers。 (使用通用 J2SE中引入的参数化类型 5.0,此类型表示为LinkedList。)另一方面 手,C#没有原始包装 类,但允许任何拳击 值类型,返回通用对象 参考
盒装对象始终是副本 价值对象,通常是 不可改变的。同时拆箱对象 返回存储值的副本。 注意重复装箱和拆箱 对象可能会很严重 性能影响,因为它 动态分配新对象和 然后使他们有资格获得垃圾 集合。
答案 4 :(得分:1)
目前,将primtive直接存储到集合中的唯一方法是为每个基本类型设置一个集合,例如: TIntArrayList。
您可能会发现即使ArrayList比使用原语慢,但对于90%以上的用例来说,它足够快。
答案 5 :(得分:0)
性能问题是问题之一,因为我们需要自动装箱来实现这一目标。此外,一些结构也可能受益于空值。
答案 6 :(得分:-1)