Java中的原语和包装类之间的真正区别是什么

Har*_*dik 1 java int primitive integer wrapper

我理解这样的东西:

  1. 包装类创建一个对象,原始类不创建对象
  2. 包装类与集合一起使用来表示类型
  3. 包装器有方法,可以保存内存地址/空值,原语保存默认值
  4. 与包装类相比,原语速度更快,因为没有方法或对象的开销
  5. 自动装箱和拆箱的工作原理
  6. 包装类包装原始类型

但是,无法理解原语和包装类之间的真正区别。为什么需要创建两种不同的方式来保存数据?为什么我们不重用已经可用的东西?例如,如果包装类是在原语之前引入的,那么为什么我们不使用包装类而不是为类似的目的完全开发一种不同的方式,反之亦然。

Jon*_*oni 6

真正的区别在于原始类型不是引用类型

在 Java 类型系统中,引用类型有一个公共根,而原始类型没有:所有引用类型都是Object. 相比之下,原始类型没有共同的根;每个原始类型都是它自己的特殊独角兽。

这意味着用Objecttype声明的变量可以保存任何引用类型的值,但不能保存任何原始类型的值。

如果您想创建通常有用的数据结构,这是一个问题。考虑如何实现“动态数组”数据结构,如 ArrayList 或 Vector。您可以使用数组Object[]来存储元素,这适用于所有引用类型。但是由于原始类型没有共同的根,您必须为每个原始类型创建一个单独的实现。

为了解决这个问题,创建了包装类。现在,不需要动态数组的 8 个单独实现(1 个用于引用类型,7 个用于原始类型),您可以将每个原始值包装在一个对象中,并且只使用引用类型的实现。

原始类型和包装类是在 Java 1.0 的第一个设计和实现的同时创建的。设计师没有“重用已经可用的东西”,因为没有可用的东西:他们从头开始构建一切。

设计人员是否可以通过其他方式解决这个问题,也许是通过创建一个类型系统,该系统对原始类型和引用类型都有一个共同的根?是的,但他们没有,而且他们可能有很好的理由:实现复杂性、易于理解、上市时间……