Java集合。为什么没有原始类型?

时间:2011-01-04 14:12:47

标签: java collections arraylist primitive-types

  

可能重复:
  storing primitive values in a java collection?

我的Java教科书说集合的元素,例如ArrayList,不能是原始类型。是否有一个原因?我的意思是Sun的某个人是否决定了这一点,或者是否存在阻碍这样做的障碍?我理解我的例子半答案我的问题,因为ArrayList需要一个对象,而原语不是对象。但后来我想为什么它们也不能有原始类型呢?

7 个答案:

答案 0 :(得分:7)

  

是否存在阻碍做法的障碍   它?

您可以编写近似相同版本的ArrayList,这些版本是为了存储其中一种非类型类型而量身定制的,例如IntegerArrayList等等。阻碍这种情况的障碍是,这样的类会爆炸,因为你将原始类型的数量乘以集合类型的数量。为了使标准集合框架易于管理,这被排除了。

为了在语言中更加巧妙地解决这个问题,你需要泛型来允许基本类型作为类型参数,并改善数组和泛型之间的交互。

答案 1 :(得分:5)

存储未包装的基元会使收集代码大大复杂化。然而,使用包装器(Integerint),代码是相当简单的。几年来,Java一直支持“自动装箱”,这意味着如果你给int预期Integerint就会被Integer包裹起来你的实例(反之亦然)。

答案 2 :(得分:4)

有一些称为“包装器”的对象代表所有基本类型。例如,有一个名为Integer的类支持int。您可以使用原始包装器来保存Collection中的值。

原始类型的问题(至少在Java 5之前)是它们没有从基类Object类扩展。所有集合都需要为它们使用的所有方法指定一个类 - 它们指定Object,因为Object是所有类的基础。

从Java 5开始,您将发现Java将在您需要时隐式地在基元和相应的包装类之间切换。这意味着您可以向集合中添加intdouble等。 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)