我听说类型被称为“盒装”类型。在某些语言中。

在Java中,我听说过“autoboxing”。这是什么?它是否有类型的包装类?如果我使用盒装或非盒装类型,我的代码会如何变化?

有帮助吗?

解决方案

某些数据类型被视为“原始”,这意味着它们不会被视为对象,也不具有对象的属性。

在大多数平台上,整数和字符是原始类型但可以装箱的类型的示例。

拳击意味着将它们包裹在一个对象中,以便它们具有对象的行为。

确切的含义和行为取决于您使用的语言。有些语言(比如Smalltalk ......至少在我这样做的时候回来......)不允许任何原始类型并认为所有东西都是一个对象,但是有一个与之相关的性能损失,因为最后当天,处理器需要使用原始数字和原始内存来完成有用的工作。如果你想添加两个已装箱的整数,例如,在幕后它们是“未装箱”的。在原始类型中,添加数字,然后将它们装回一个新的整数。

其他提示

Java的更具体信息:

Autoboxing允许java自动将 boolean int 之类的东西自动转换为Object对象版本 Boolean Integer 在多数情况下。它也允许相反的情况发生。

例如:

int a = 3; // no boxing is happening
Integer b = 3;  // newer versions of java automatically convert the int 3 to Integer 3
int c = b;  // these same versions also automatically convert Integer 3 to int 3

没有自动装箱的旧版Java将要求此代码执行相同的操作:

int a = 3;  // works the same
Integer b = new Integer(3);  //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive

但是,在某些情况下,您仍需要手动执行操作。例如,假设您有一个包含两个方法的类:

assertEquals(int a, int b);
assertEquals(Object a, Object b)

现在,如果您尝试这样做:

Integer a = 3;
int b = 3;
assertEquals(a, b);  // this will not compile

这不起作用的原因是因为它无法弄清楚它是否应该将 a 拆分为 int 或将 b 改为<代码>整数。因此,应该调用哪个方法签名是不明确的。要解决此问题,您可以执行以下操作之一:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);

是的,拳击意味着获取值类型并将其包装在引用类型中。由于java引入了自动装箱,你可以这样做:

void foo(Object bar) {}
//...
    foo(1);

java会自动将int 1转换为Integer。在以前的版本中,你必须这样做:

foo(new Integer(1));

在使用泛型时,autoboxing在java中最有用,因为你不能在泛型中使用基元,所以要在列表中存储int,你必须创建一个 List&lt; Integer&gt; 并将整数放入装箱的列表中。

盒装类型意味着值在堆上的块中分配并通过指针引用。这有利于运行时的实现的一致性(它使得更容易具有泛型函数等),代价是额外的间接。

通常,当您使用集合时,您将处理对象数组。在像Java这样的语言中,基元和对象之间存在差异。当一个原语被“装箱”时,它基本上只是一个原语的包装器,所以它对于期望一个Object的框架的其余部分很好。

Autoboxing只是将一个原语放入一个对象或者透明地从一个对象中拉出一个原语的行为,所以你不必担心自己做一个额外的步骤。

Boxed表示他们采用常规值类型并在其周围创建了一个对象。有点像把它放在一个盒子里。由于构造对象的开销,通常应该避免这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top