Java:为什么需要包装类?

Mid*_*lue 30 java collections

在非常高的层次上,我知道我们需要通过使用它们各自的包装类来"包装"原始数据类型,例如int和char,以便在Java集合中使用它们.我想了解Java集合如何在通过询问低级别:"为什么我们需要将原始数据类型包装为能够在集合中使用它们的对象?"我提前感谢您的帮助.

Jus*_*ner 37

因为Java集合只能存储对象引用(因此您需要将原始图形存储在集合中).

阅读这篇关于Autoboxing的简短文章了解更多信息.

如果你想要细节,那么它几乎归结为以下几点:

Local Primitives存储在Stack上.集合通过引用堆中对象的内存位置来存储它们的值.要获取本地原语的引用,您必须将该值(在堆栈上取值并将其包装以存储在堆上)值.


Koh*_*chi 18

在虚拟机级别,这是因为与java.lang.Object及其派生类型等引用类型相比,基元类型在内存中的表示方式非常不同.例如,Java中的原始int在内存中只有4个字节,而Object本身至少占用8个字节,另外还有4个字节用于引用它.这种设计简单地反映了CPU可以更有效地处理原始类型的事实.

因此,对于"为什么需要包装器类型"这一问题的一个答案是因为它能够提高性能.

但是对于程序员来说,这种区别会增加一些不良的认知开销(例如,不能在集合中使用int和float.)事实上,通过隐藏这种区别很有可能进行语言设计 - 许多脚本语言都这样做,并且CLR这样做.从1.5开始,Java也是这样做的.这是通过让编译器在基本表示和对象表示(通常称为装箱/拆箱)之间静默插入必要的转换来实现的.

所以对你的问题的另一个答案是,"不,我们不需要它",因为编译器会自动为你做,并且在某种程度上你可以忘记场景背后发生的事情.

  • @Midnight Blue - 在这里阅读第一个答案(作者Jon Skeet):http://stackoverflow.com/questions/2099695/java-array-is-stored-in-stack-or-heap.它解释了有关如何在JVM中存储事物以及何时存储的更多信息. (2认同)

Pri*_*jee 6

阅读所有答案,但没有一个答案能简单地用外行术语解释清楚。

包装类包装(封装)围绕一个数据类型(可以是任何原始数据类型如int,焦炭,字节长),并使其成为一个对象

以下是需要包装类的几个原因:

  1. 允许null值。

  2. 可以收集诸如使用ListMap等等。

  3. 可以在接受Object类型参数的方法中使用。

  4. 可以像使用new ClassName()其他对象一样创建对象:

    Integer wrapperInt = new Integer("10");
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使得所有可用的功能Object类有如clone()equals()hashCode()toString()等。

可以通过两种方式创建包装类:

  1. 使用构造函数:

    Integer i = new Integer("1"); //new object is created
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用valueOf()静态方法:

     Integer i  = Integer.valueOf("100"); //100 is stored in variable
    
    Run Code Online (Sandbox Code Playgroud)

建议使用第二种创建包装类的方法,因为它占用的内存较少,因为没有创建新对象。