Работа внутри, когда мы добавляем два объекта Integer?

Может кто-нибудь объяснить мне, как внутреннее поведение, когда мы добавляем два объекта Integer в java? (например, это unbox Object в примитивы, а затем добавить два целых числа и, наконец, вставить его в объект Integer)

Integer sum = new Integer(2) + new Integer(4); 

Ответ 1

Он скомпилирован в это:

Integer sum = Integer.valueOf(new Integer(2).intValue()+new Integer(4).intValue());

Вы можете проверить это, посмотрев на дизассемблер байтового кода, полученный с помощью javap -c.

Вот часть, которая соответствует новому Integer (2).intValue(), оставив int 2 в стеке:

0:  new #2; //class java/lang/Integer
3:  dup
4:  iconst_2
5:  invokespecial   #3; //Method java/lang/Integer."<init>":(I)V
8:  invokevirtual   #4; //Method java/lang/Integer.intValue:()I

Вот часть, которая соответствует новому Integer (4).intValue(), оставив int 4 в стеке:

11: new #2; //class java/lang/Integer
14: dup
15: iconst_4
16: invokespecial   #3; //Method java/lang/Integer."<init>":(I)V
19: invokevirtual   #4; //Method java/lang/Integer.intValue:()I

И здесь сумма 2 + 4 вычисляется с помощью iadd, сумма помещается в Integer по вызову Integer.valueOf, а результат сохраняется в первой локальной переменной (astore_1):

22: iadd
23: invokestatic    #5; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
26: astore_1

Ответ 2

создание двух экземпляров Integer.

Автоматическая распаковка этих двух экземпляров.

new int, который содержит результат.

Автоматическое боксирование результата в экземпляр Integer sum.