【问题标题】:Java collections. Why no Primitive Types? [duplicate]Java 集合。为什么没有原始类型? [复制]
【发布时间】:2011-06-03 10:21:46
【问题描述】:

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

我的 Java 教科书说集合的元素,例如 ArrayList,不能是原始类型。是否有一个原因?我的意思是 Sun 有人决定这样做还是有一些障碍反对这样做?我理解我的示例半回答了我的问题,因为 ArrayList 需要一个对象,而基元不是对象。但后来我想为什么他们不能也有原始类型呢?

【问题讨论】:

    标签: java collections arraylist primitive-types


    【解决方案1】:

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

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

    从 Java 5 开始,您会发现 Java 会在您需要时隐式地在原语和它对应的包装类之间切换。这意味着您可以将intdouble 等添加到集合中。 VM 会自动为您将原语包装在包装器类中,并将包装器放置在 Collection 中。

    【讨论】:

    • “原始类型的问题(至少在 Java 5 之前)”... 以及更高版本。虽然现在有了自动装箱,但仍然没有基本类型的通用基类。
    【解决方案2】:

    目前,将基元直接存储到集合中的唯一方法是为每个基元类型创建一个集合,例如TIntArrayList。

    您可能会发现,尽管 ArrayList 比使用原语要慢,但它对于 90+% 的用例来说已经足够快了。

    【讨论】:

      【解决方案3】:

      性能问题是问题之一,因为我们需要自动装箱才能实现这一点。此外,一些结构也可能受益于空值。

      【讨论】:

        【解决方案4】:

        这样做有什么障碍吗 吗?

        您可以编写几乎相同的 ArrayList 版本,这些版本是为存储一种非类类型而量身定制的,例如IntegerArrayList 等等。这样做的障碍是这样的类会爆炸式增长,因为您将原始类型的数量乘以集合类型的数量。为了使标准集合框架易于管理,这被排除在外。

        要在语言中更巧妙地解决这个问题,您需要泛型以允许原始类型用作类型参数,并改进数组和泛型之间的交互。

        【讨论】:

          【解决方案5】:

          在维基百科上阅读这篇文章。它可能会有所帮助:http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing

          在计算机科学中,对象类型 (又名包装对象)是一种数据类型 用于面向对象的 包装非对象类型的编程 使它看起来像一个动态对象。

          一些面向对象的编程 语言区分 引用和值类型,通常 称为对象和非对象 在复杂值类型的平台上 不存在,原因如下 运行时效率和语法或 语义问题。例如,Java 有 原始包装类 对应于每个原始类型: Integer 和 int,Character 和 char, 浮点数和浮点数等。语言如 C++ 很少或根本没有 参考类型;因此,使用 对象类型没什么兴趣。

          装箱是放置一个 对象内的原始类型,所以 该原语可以用作 参考对象。例如,列表 可能有某些方法哪些数组 可能不会,但列表也可能 要求其所有成员都是 动态对象。在这种情况下, 列表的添加功能可能 无法使用一个简单的数组 数字。举一个更具体的例子, 在 Java 中,LinkedList 可以改变它的 大小,但数组必须有一个固定的 尺寸。一个人可能希望拥有一个 整数的 LinkedList,但 LinkedList 类只列出对动态的引用 对象——它不能列出原语 types,它们是值类型。

          为了避免这种情况,可以将整数装箱 成整数,它们是动态的 对象,然后添加到 整数的链表。 (使用通用 J2SE 中引入的参数化类型 5.0,此类型表示为 LinkedList。)另一方面 手,C# 没有原始包装器 类,但允许拳击任何 值类型,返回一个泛型 Object 参考。

          装箱的对象始终是 值对象,通常是 不可变的。也拆箱对象 返回存储值的副本。 注意重复装箱和拆箱 的对象可以有一个严重的 性能影响,因为它 动态分配新对象和 然后使他们有资格获得垃圾 收藏。

          【讨论】:

            【解决方案6】:

            存储展开的原语会使集合代码变得非常复杂。而使用包装器(Integer 代表 int 等),代码相当简单。几年来,Java 一直支持“自动装箱”,这意味着如果您在预期 Integer 的地方提供 int,则 int 会为您包装在 Integer 实例中(反之亦然) - 反之)。

            【讨论】:

              猜你喜欢
              • 2013-01-06
              • 2014-01-26
              • 2021-07-06
              • 2015-07-30
              • 2011-02-17
              • 2010-11-01
              • 1970-01-01
              • 2018-07-29
              相关资源
              最近更新 更多