在Java中将基本数据类型封装成包装类时,调用的是哪个包装类的方法?

4

当您执行 Integer i = 1; 时,Integer 类中的哪个方法将被使用?

我相信这不是构造函数,可能是 valueOf() 方法。


可能是编译器为自动装箱生成什么代码?的重复。 - Xavi López
3个回答

5

Integer.valueOf(int)、Boolean、Byte、Character、Long、Float和Double同样适用。

注意:对于Boolean和Byte,所有可能的值都被缓存。 对于Character,值0到127被缓存。 对于Short和Long值,-128到127被缓存。 对于Integer,默认情况下缓存-128到127,但是可以使用多个选项来增加最大值。

这可能会导致出现令人惊讶的行为。

System.out.println((Integer) (int) -128 == (Integer) (int) -128);
System.out.println((Integer) (int) -129 == (Integer) (int) -129);

打印

true
false

不确定为什么需要使用 (int) -128 来强制将 -128 转换为整型以使其在 Java 7 中编译通过。


我正在研究整数源代码的缓存部分,所以我想知道在装箱时使用了哪种方法,因为构造函数没有使用“+-127缓存”。 - Stijn Vanpoucke
构造函数必须每次创建一个新对象,它没有选择余地。 我讨厌的事情之一是人们使用 new Boolean(flag) ;) - Peter Lawrey

5

是的,这是valueOf:

以下是javap的输出:

public static void main(java.lang.String[]);
  Code:
   Stack=1, Locals=2, Args_size=1
   0:   iconst_1
   1:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   4:   astore_1
   5:   return
  LineNumberTable:
   line 5: 0
   line 6: 5

3

实际上是valueOf()。看一下可能的重复问题:编译器为自动装箱生成什么代码?

对于范围在-128、127之间的整数,当使用valueOf时,你永远不会看到构造函数被调用,因为Integer已经缓存了这些实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接