- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int to an Integer, a double to a Double, and so on. If the conversion goes the other way, this is called unboxing.
那么为什么我们需要它以及为什么我们在 Java 中使用自动装箱和拆箱?
最佳答案
需要一些上下文才能完全理解其背后的主要原因。
Java 中的原始变量包含值(整数、 double 浮点二进制数等)。因为these values may have different lengths ,包含它们的变量也可能有不同的长度(考虑 float
与 double
)。
另一方面,类变量包含对实例的引用。在许多语言中,引用通常被实现为指针(或与指针非常相似的东西)。这些东西通常具有相同的大小,无论它们引用的实例的大小如何(Object
、String
、Integer
等)。
类变量的这个属性使得它们包含的引用可以互换(在一定程度上)。这使我们能够进行我们所说的替换:广义上讲, to use an instance of a particular type as an instance of another, related type (例如,使用 String
作为 Object
)。
原始变量不能以同样的方式互换,既不能相互互换,也不能与Object
互换。 .最明显的原因(但不是唯一的原因)是它们的尺寸差异。这使得原始类型在这方面不方便,但我们仍然需要在语言中使用它们(原因主要归结为性能)。
泛型类型是具有一个或多个类型参数的类型(确切的数字称为泛型参数)。例如,泛型类型定义 List<T>
有一个类型参数 T
, 可以是 Object
(生产具体类型 List<Object>
),String
( List<String>
), Integer
( List<Integer>
) 等等。
泛型比非泛型复杂得多。当它们被引入 Java 时(在其初始版本之后),为了避免对 JVM 进行彻底的更改并可能破坏与旧二进制文件的兼容性,Java 的创建者决定以侵入性最小的方式实现泛型类型: List<T>
的所有具体类型实际上,被编译为(二进制等价物)List<Object>
(对于其他类型,界限可能不是 Object
,但你明白了)。 在这个过程中会丢失泛型和类型参数信息,这就是我们称之为type erasure的原因。 .
现在的问题是上述现实的结合:如果 List<T>
变成 List<Object>
在所有情况下,然后 T
必须始终是可以直接分配给 Object
的类型。其他任何事情都不允许。因为,正如我们之前所说,int
, float
和 double
不能与 Object
互换, 不能有 List<int>
, List<float>
或 List<double>
(除非 JVM 中存在更复杂的泛型实现)。
但 Java 提供像 Integer
这样的类型, Float
和 Double
它将这些原语包装在类实例中,使它们可以有效地替换为 Object
,因此允许泛型类型间接使用原语(因为您可以拥有 List<Integer>
、List<Float>
、List<Double>
等等)。 p>
创建 Integer
的过程来自 int
, 一个 Float
来自 float
以此类推,称为 boxing 。反过来称为拆箱。因为每次您想将它们用作 Object
时都必须对它们进行装箱。不方便,在某些情况下语言会自动执行此操作 - that's called autoboxing .
关于java - 为什么我们在 Java 中使用自动装箱和拆箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647407/
请告诉我哪种算法适用于以下问题: 在给定的 3 个月内,我们的项目数量有限(通常 < 50)。每个项目都有一定的小时数。 我们在同一 3 个月内拥有有限数量的资源(通常 < 100)。 每个资源每个月
我了解装箱和拆箱是关于强制转换(将实型转换为对象...将对象转换为实型)的。但是我不明白MSDN对Nullable的评价。这是我不明白的文字: When a nullable type is boxe
据我了解,Java 具有装箱(堆)和未装箱(堆栈)变量,如果我将装箱类型分配给未装箱类型,反之亦然,则涉及 (n) (un) 装箱成本。 拆箱比分配一个新的装箱对象便宜吗?如果以只读方式使用,盒装对象
装箱/拆箱和类型转换之间有什么区别? 这些术语似乎经常可以互换使用。 最佳答案 装箱是指将不可空值类型转换为引用类型或将值类型转换为其实现的某个接口(interface)(例如 int 到 IComp
给定一组项目,每个项目都有一个值,确定要包含在集合中的每个项目的数量,以使总值小于或等于给定限制,并且总值尽可能大。 例子: Product A = 4Product B = 3Product C =
我正在编写一个一维装箱程序。我只想要一个可能的垃圾箱。所以它不包括很多垃圾箱,它是唯一的一个。该程序仅搜索四边形组,如果四边形组不等于搜索数量则爆炸。我想搜索大于四边形的每个可能的组。在示例中,我们有
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我最近的代码包括很多 boxing and unboxing ,因为我的许多变量都是在运行时解析的。但是我读到装箱和拆箱在计算上非常昂贵,所以我想问一下是否还有其他方法可以对类型进行装箱/拆箱?这甚至
我的作业是装箱问题,要求我展示如何从优化版本解决问题的决策版本,反之亦然。我知道要解决决策版本,您只需获取优化版本中使用的 bin 数量并将其与指定的最大 bin 数量进行比较,但我如何使用决策版本来
这是在不使用外部库的情况下在 Java 中装箱/拆箱多维原始数组的最有效方法吗? private Float[][] toFloatArray(float[][] values) { Float
我有一个头疼的问题,感觉类似于经典的装箱问题,但我无法确定。任何帮助表示赞赏... 问题: 我有一组尺寸相同的产品,但有不同颜色的款式和不同的订单数量要求。 我可以任意组合包装,但我只能有规定数量的不
我有一个由 df.column.value_counts().sort_index() 生成的 Pandas 系列。 | N Months | Count | |------|------| |
大家可以向我解释一下 new 的性质以及 Integer 的使用 Integer i = new Integer(-10); Integer j = new Integer(-10); Integer
如果我错了,请纠正我,将值类型装箱转换为引用类型,那么为什么以下代码给出 10 输出而不是 12? public static void fun(Object obj) { o
如果我理解 CLR 装箱和处理可空值的方式,如 Boxing / Unboxing Nullable Types - Why this implementation? 中所述,我仍然有一些困惑。例如,
我经常使用 div 来装箱信息,但我注意到包装箱有时可能不会填满空间,这会导致来自其他包装器的元素进入箱区域。 例如: my info1 my Info2 看看这个例子 .topic {
目前我有这门课 public class Currency { private int _Amount; public Currency(){... } public Curr
我收集了 43 到 50 个数字,范围从 0.133 到 0.005(但大部分偏小)。如果可能的话,我想找到 L 和 R 之间总和非常接近的所有组合。* 蛮力法需要 243 到 250 步,这是不可行
我试图从性能的角度了解两种解决方案中的哪一种是首选。比如我有两段代码: 1) 装箱/拆箱 int val = 5; Session["key"] = val; int val2 = (int)Sess
通过 C# 在装箱/拆箱值类型上从 CLR 中提取 ... 关于装箱:如果可为空的实例不是null,CLR 会从可为空的实例中取出值并将其装箱。换句话说,值为 5 的 Nullable 装箱到值为
我是一名优秀的程序员,十分优秀!