Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Java ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°/распаковка. Автоупаковка ΠΈ распаковка это функция прСобразования ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

ВступлСниС

Π―Π·Ρ‹ΠΊ программирования, ΠΊΠ°ΠΊ ΠΈ язык Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ говорят люди, ΠΆΠΈΠ²Ρ‘Ρ‚ ΠΈ мСняСтся, Π² Π½Ρ‘ΠΌ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ явлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ языком Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅. А ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ язык Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ°Ρ‚ΡŒ наши мысли. Π’ вСрсиях Π½ΠΈΠΆΠ΅ JDK 1.5 Π±Ρ‹Π»ΠΎ Π½Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ int, char, float, double Π² ΠΈΡ… классы ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Integer, Character, Float, Double. Π˜Ρ‚Π°ΠΊ, Π² Java SE 5 Π±Ρ‹Π» прСдставлСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ/распаковки (boxing/unboxing). И особСнности этого срСдства Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ мыслСй посвящён ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ tutorial ΠΎΡ‚ Oracle: Autoboxing and Unboxing.

Автоупаковка Autoboxing

Π”Π°Π²Π°ΠΉΡ‚Π΅, рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π°Π²Ρ‚ΠΎΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Boxing. Π‘Π½Π°Ρ‡Π°Π»Π°, посмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ сайтом compilejava.net ΠΈ создадим класс:
public class App {
    public static void main(String[] args) {
        Integer portNumber = 8080;
        if (args.length != 0) {
            portNumber = Integer.valueOf(args[0]);
        }
        System.out.println("Port number is: " + portNumber);
    }
}
ΠŸΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ ΠΊΠΎΠ΄. МоТСм ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°. Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‚.ΠΊ. ΠΌΡ‹ считываСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π° ΠΈΠ· String ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Integer ΠΏΡƒΡ‚Ρ‘ΠΌ получСния Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· Integer.valueOf. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΌΡ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, Π° ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Integer. И Ρ‚ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ с ΠΎΠ΄Π½ΠΎΠΉ стороны, Ρƒ нас пСрСмСнная ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ – ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ². И ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Но ΠΌΡ‹ вСдь Π½Π΅ Π²Π΅Ρ€ΠΈΠΌ Π² магию? Π”Π°Π²Π°ΠΉΡ‚Π΅ заглянСм Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚Β», Ρ‡Ρ‚ΠΎ называСтся. Π‘ΠΊΠ°Ρ‡Π°Π΅ΠΌ с compilejava.net исходный ΠΊΠΎΠ΄, Π½Π°ΠΆΠ°Π² Β«Download ZIPΒ». ПослС этого ΠΈΠ·Π²Π»Π΅Ρ‡Ρ‘ΠΌ скачанный Π°Ρ€Ρ…ΠΈΠ² Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ Π² Π½Π΅Π³ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ: javap -c -p App.class Π³Π΄Π΅ App.class - скомпилированный class Ρ„Π°ΠΉΠ» для вашСго класса. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ содСрТимоС Π²Ρ€ΠΎΠ΄Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ:
Автоупаковка ΠΈ распаковка Π² Java - 2
Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΎΡ‚ самый прСсловутый Β«Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Β». Но Π²Π°ΠΆΠ½ΠΎ Π½Π°ΠΌ сСйчас Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ. Π‘Π½Π°Ρ‡Π°Π»Π° Π² стэк выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° помСщаСтся ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² 8080, Π° дальшС выполняСтся Integer.valueOf. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚Π° «магия» boxing. А Π²Π½ΡƒΡ‚Ρ€ΠΈ магия выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:
Автоупаковка ΠΈ распаковка Π² Java - 3
Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎ сути Π±ΡƒΠ΄Π΅Ρ‚ взят Π½ΠΎΠ²Ρ‹ΠΉ Integer ΠΈΠ»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Integer ΠΈΠ· кэша (кэш Π½ΠΈΡ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅ ΠΊΠ°ΠΊ просто массив ΠΈΠ· Integer) Π² зависимости ΠΎΡ‚ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ значСния числа. ЕстСствСнно, Integer Π½Π΅ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‚Π°ΠΊ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ. Π•ΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ список соотносящихся ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΡ… ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΎΠΊ (классов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ Π² ΠΌΠΈΡ€Π΅ ООП). Π”Π°Π½Π½Ρ‹ΠΉ список ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ Π² самом Π½ΠΈΠ·Ρƒ Tutorial ΠΎΡ‚ Oracle: Β«Autoboxing and UnboxingΒ». Π‘Ρ‚ΠΎΠΈΡ‚ сразу ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ массивы ΠΈΠ· ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Β«ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈΒ» Π±Π΅Π· ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π’.Π΅. Arrays.asList Π½Π΅ сдСлаСт ΠΈΠ· int[] для нас List ΠΈΠ· Integer’ов.

Распаковка Unboxing

ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ процСсс ΠΊ boxing называСтся unboxing распаковка. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ распаковки:
public class App {

    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("Please, enter params");
            return;
        }
      	int value = Math.abs(Integer.valueOf(args[0]));
        System.out.println("Absolute value is: " + value);
    }

}
Math.abs ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹. Π§Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ? Π£ класса ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Π΅ΡΡ‚ΡŒ Π½Π° этот случай ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ². НапримСр, для Integer это ΠΌΠ΅Ρ‚ΠΎΠ΄ intValue. Если ΠΌΡ‹ посмотрим Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ:
Автоупаковка ΠΈ распаковка Π² Java - 4
Как Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ. Всё Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Java. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ «само». Для нашСго удобства. Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π²Ρ‚ΠΎΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈ распаковка? Автоупаковка примСняСтся компилятором Java Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условиях:
  • Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° пСрСдаСтся Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.
  • Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.
  • Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСдаСтся Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.
  • Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Boxing/Unboxing Π² Ρ†ΠΈΠΊΠ»Π΅

Π˜Ρ‚Π°ΠΊ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ арифмСтичСской прогрСссии ΠΎΡ‚ 0 Π΄ΠΎ 1 000 000 000 с шагом 1. Π‘Π»ΡƒΡ‡Π°ΠΉ 1 ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ написали Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:
public class Test {
    public static void main(String[] args) {

        Long result = 0L;

        for (int i = 0; i < 1_000_000_000; i++) {
            result += i;
        }

        System.out.println("Result:" + result);
    }
}
Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ? Π”Π°, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ? РазбСрёмся. Для Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ получился (Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ: javap –c Test.class). Π’ΠΎΡ‚ Π² Ρ‚Π°ΠΊΡƒΡŽ ΡƒΠΆΠ°ΡΠ°ΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ прСобразился наш Ρ†ΠΈΠΊΠ» for:
10: if_icmpge     30
13: aload_1
14: invokevirtual #4        // Method java/lang/Long.longValue:()J
17: iload_2
18: i2l
19: ladd
20: invokestatic  #2         // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
23: astore_1
24: iinc          2, 1
27: goto          7
Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎ порядку:
  • 13 – ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Long result Π² стСк ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ²
  • 14 – РаспаковываСм ссылочный Long Π² ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ long
  • 17 – ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² стСк ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ int i
  • 18 – ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Ρ‘ ΠΊ Ρ‚ΠΈΠΏΡƒ long
  • 19 – Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ складываСм long result ΠΈ long i
  • 20 – Π·Π°ΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ссылочный Ρ‚ΠΈΠΏ Long
  • 23 – ΠΈ сохраняСм ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² нашСм Ρ†ΠΈΠΊΠ»Π΅ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈ распаковка выполнятся, всСго-Ρ‚ΠΎ, ΠΏΠΎ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Ρƒ Ρ€Π°Π·. Помимо этого, Ρ‚ΠΈΠΏ Long являСтся immutable, Π° это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Long.valueOf() (строка β„–20 Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°) ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€ΠΈ этом старый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ остаётся Π² памяти ΠΈ ΠΆΠ΄Ρ‘Ρ‚, ΠΊΠΎΠ³Π΄Π° Π·Π° Π½ΠΈΠΌ ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ GC. Π’ ΠΈΡ‚ΠΎΠ³Π΅, ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, сборщик мусора Π½Π° ΠΌΠΎΠ΅ΠΉ машинС срабатывал Π² срСднСм 46 Ρ€Π°Π·. Π‘Π»ΡƒΡ‡Π°ΠΉ 2 ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ result Π½Π° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ long:
public class Test {
    public static void main(String[] args) {

        long result = 0;

        for (int i = 0; i < 1_000_000_000; i++) {
            result += i;
        }

        System.out.println("Result:" + result);
    }
}
ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° стало мСньшС.
7: if_icmpge     21
10: lload_1
11: iload_3
12: i2l
13: ladd
14: lstore_1
15: iinc          3, 1
18: goto          4
  • 10 – ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² стСк ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² Π½Π°ΡˆΡƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ result
  • 11 – ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² стСк ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ int i
  • 12 – ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ int i Π² long i
  • 13 – складываСм long result ΠΈ long i
  • 14 – сохраняСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
Π‘Ρ€Π°Π·Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ избавились ΠΎΡ‚ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ распаковки/ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ. А Π΅Ρ‰Ρ‘, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΌΡ‹ Π½Π΅ заставляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΡƒΡ‡Ρƒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° врСмя выполнСния ΠΎΠ±ΠΎΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:
  • Π‘Π»ΡƒΡ‡Π°ΠΉ 1 – Π² срСднСм 5100 мс
  • Π‘Π»ΡƒΡ‡Π°ΠΉ 2 – Π² срСднСм 535 мс
ΠŸΠΎΡ‡Ρ‚ΠΈ 10-ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ прирост ΠΏΠΎ скорости. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π² ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ классы-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ ΠΈ с Π½ΠΈΠΌΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ распаковку Π·Π°Ρ€Π°Π½Π΅Π΅, Π½Π΅ полагаясь Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ JVM всё Π·Π° вас ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠ°ΠΊ я Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΈ считал.

Π“Ρ€Π°Π±Π»ΠΈ (НСдостатки Автоупаковки)

Π›ΡŽΠ±ΠΎΠΉ инструмСнт ΠΏΡ€ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ использовании становится Π³Ρ€ΠΎΠ·Π½Ρ‹ΠΌ ΠΎΡ€ΡƒΠΆΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΡ‚ΠΈΠ² самого сСбя. И ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°Π²Ρ‚ΠΎΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈ распаковка boxing/unboxing Π² Java Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π²ΠΎΠ΅, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅, сравнСниС Ρ‡Π΅Ρ€Π΅Π· ==. Π”ΡƒΠΌΠ°ΡŽ, это понятно, Π½ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π΅Ρ‰Ρ‘ Ρ€Π°Π·:
public static void main(String[] args) {
    Integer inCacheValue = 127;
    Integer inCacheValue2 = 127;
    Integer notInCache = 128; // new Integer(129)
    Integer notInCache2 = 128; // new Integer(129)
    System.out.println(inCacheValue == inCacheValue2); //true
    System.out.println(notInCache == notInCache2); //false
}
Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ бСрётся ΠΈΠ· кэша Integer Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (см. объяснСниС Boxing Π²Ρ‹ΡˆΠ΅), Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Но Ρ‚ΡƒΡ‚ стоит ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ кэша (java.lang.Integer.IntegerCache.high). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эта Π³Ρ€Π°Π½ΠΈΡ†Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ ΠΈ ΠΈΠ·-Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… настроСк. На эту Ρ‚Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с обсуТдСниСм Π½Π° stackoverflow: How large is the Integer cache? ЕстСствСнно, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· equals: System.out.println(notInCache.equals(notInCache2)); Вторая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с этим ΠΆΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ – ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π›ΡŽΠ±Π°Ρ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° Π² Java Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½Π° созданию Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если число Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² значСния ΠΈΠ· кэша (Ρ‚.Π΅. Π² -128 Π΄ΠΎ 127), Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Если Π²Π΄Ρ€ΡƒΠ³ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° (Ρ‚.Π΅. boxing) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅, это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ прирост Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ рСсурсов Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ сборщика мусора. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π΅ стоит слишком бСзрассудно относится ΠΊ этому. Π’Ρ€Π΅Ρ‚ΡŒΠΈ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π±ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π³Ρ€Π°Π±Π»ΠΈ Π²Ρ‹Ρ‚Π΅ΠΊΠ°ΡŽΡ‚ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°:
public static void check(Integer value) {
    if (value <= 0) {
        throw new IllegalStateException("Value is too small");
    }
}
Π’ этом ΠΊΠΎΠ΄Π΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ явно пытался Π½Π΅ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΌΠΈΠΌΠΎ ошибки. Но Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° null. Если Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ null, Ρ‚ΠΎ вмСсто понятной ошибки ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ нСвнятный NullPointerException. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ для сравнСния Java ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ value.intValue ΠΈ свалится, Ρ‚.ΠΊ. value Π±ΡƒΠ΄Π΅Ρ‚ null.

Ошибка NoSuchMethodError

Π’ этом Π±Π»ΠΎΠΊΠ΅ я ΠΏΠΎΠΊΠ°ΠΆΡƒ интСрСсный для мСня случай с ошибкой NoSuchMethodError, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ·-Π·Π° смСшивании классов, скомпилированных Π΄ΠΎ Π°Π²Ρ‚ΠΎΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ/автораспаковки, с классами скомпилированных послС. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ дСмонстрируСт класс(Sum), ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ написан Π΄ΠΎ J2SE 5. Он ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ add, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ смог Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сумму Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½Π΅Π³ΠΎ.
import java.util.ArrayList;
public class Sum
{
   private double sum = 0;
   public void add(short newShort)
   {
      sum += newShort;
   }
   public void add(int newInteger)
   {
      sum += newInteger;
   }
   public void add(long newLong)
   {
      sum += newLong;
   }
   public void add(float newFloat)
   {
      sum += newFloat;
   }
   public void add(double newDouble)
   {
      sum += newDouble;
   }
   public String toString()
   {
      return String.valueOf(sum);
   }
}
Π”ΠΎ unboxing ΠΈ autoboxing, любой ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Sum Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² add ΠΈΠ»ΠΈ Ссли ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ пСрСвСсти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² add. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ:
private static String sumReferences(
   final Long longValue, final Integer intValue, final Short shortValue)
{
   final Sum sum = new Sum();
   if (longValue != null)
   {
      sum.add(longValue.longValue());
   }
   if (intValue != null)
   {
      sum.add(intValue.intValue());
   }
   if (shortValue != null)
   {
      sum.add(shortValue.shortValue());
   }
   return sum.toString();
}
J2SE 5 boxing Ρ€Π΅ΡˆΠΈΠ»ΠΎ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с большим количСством ΠΊΠΎΠ΄Π°. Unboxing позволяСт автоматичСски ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ссылочный Ρ‚ΠΈΠΏ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, autoboxing Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. На section ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ссылочныС Ρ‚ΠΈΠΏΡ‹ ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚. Автоупаковка, автораспаковка - 1ИзмСнСна прСдыдущая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ "автоматичСская распаковка", Π½ΠΎ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ появлСния NullPointerException.
private static String sumReferences(
   final Long longValue, final Integer intValue, final Short shortValue)
{
   final Sum sum = new Sum();
   if (longValue != null)
   {
      sum.add(longValue);
   }
   if (intValue != null)
   {
      sum.add(intValue);
   }
   if (shortValue != null)
   {
      sum.add(shortValue);
   }
   return sum.toString();
}
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° null Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ наш ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ, поэтому ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ исходный класс Sum, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Ссли ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π½Π° ссылочныС, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ класс Sum. Π’ΠΎΠ³Π΄Π° ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.
import java.util.ArrayList;
public class Sum
{
   private double sum = 0;
   public void add(Short newShort)
   {
      if (newShort != null)
      {
         sum += newShort;
      }
   }
   public void add(Integer newInteger)
   {
      if (newInteger != null)
      {
         sum += newInteger;
      }
   }
   public void add(Long newLong)
   {
      if (newLong != null)
      {
         sum += newLong;
      }
   }
   public void add(Float newFloat)
   {
      if (newFloat != null)
      {
         sum += newFloat;
      }
   }
   public void add(Double newDouble)
   {
      if (newDouble != null)
      {
         sum += newDouble;
      }
   }
   public String toString()
   {
      return String.valueOf(sum);
   }
}
ИзмСнСниС API класса Sum(ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкС NoSuchMethodErrors, Ссли ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π²ΠΎΠ²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ класс(класс-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· вСрсий Sum) скомпилирована Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ вСрсии Java. Π’ частности, Ссли класс-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΈ скомпилирован Π½Π° Java 4 ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсиях, Π° Sum Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях(оТидая ссылки, Π° Π½Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ класса), Ρ‚ΠΎ NoSuchMethodErrors Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ(Π³Π΄Π΅ "S" ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Add ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° short,Π° "V" Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ void)
Exception in thread "main" java.lang.NoSuchMethodError: Sum.add(S)V
 at Main.main(Main.java:9)
Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ скомпилирован Π½Π° java 5 ΠΈΠ»ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ обращаСтся ΠΊ Sum ссылочными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Π° Sum ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ NoSuchMethodErrors.
Exception in thread "main" java.lang.NoSuchMethodError: Sum.add(Ljava/lang/Short;)V
 at Main.main(Main.java:9)

НСсколько Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ ΠΈ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠΉ для java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ:

  • Classpaths Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ
  • .class классы скомпилированныС Π½Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… вСрсиях java ΠΈΠ·Π±Π΅ΠΆΠ°Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, возникшСй Π² этом постС
  • Classpaths Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ максимально скудным, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ/ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния случайных "старых" ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ класса.
  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сборки Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ классы ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ классы.
  • Автоупаковка ΠΈ автораспаковка часто ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ, Ссли Π½Π΅ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ…. Π’ этом постС, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ сравнСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с null ΠΏΡ€ΠΈ распаковывании, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ ссылочный Ρ‚ΠΈΠΏ Π² ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ.
  • Один ΠΈΠ· способов для опрСдСлСния Π½Π° ΠΊΠ°ΠΊΠΎΠΉ вСрсии java Π±Ρ‹Π» скомпилирован класс: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ javap -verbose ΠΈ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ строку с major version ΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ java.

Π’Ρ‹Π²ΠΎΠ΄

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ boxing/unboxing позволяСт программисту ΠΏΠΈΡΠ°Ρ‚ΡŒ мСньшС ΠΊΠΎΠ΄Π° ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡ€ΠΎΠΉ Π½Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Но это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π˜Π½Π°Ρ‡Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΠΏΠ»Ρ‹Ρ‚ΡŒ Π½Π΅ сразу. НС стоит ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° части систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ΄ нашим ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ (ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°Π½ΠΈΡ†Π° integer). Но ΠΈ Π½Π΅ стоит Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ всС прСимущСства классов-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΎΠΊ (Π²Ρ€ΠΎΠ΄Π΅ Integer). Часто эти классы-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… статичСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ΄Π΅Π»Π°ΡŽΡ‚ Π²Π°ΡˆΡƒ Тизнь Π»ΡƒΡ‡ΡˆΠ΅, Π° ΠΊΠΎΠ΄ – Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Π΄ΠΎΠ³ΠΎΠ½ΠΊΡƒ:
public static void main(String[] args) {
    int first = 1;
    int second = 5;
    System.out.println(Integer.max(first, second));
    System.out.println(Character.toLowerCase('S'));
}
Π’Π°ΠΊ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ· всСго - Π½Π΅Ρ‚ ΠΌΠ°Π³ΠΈΠΈ, Π΅ΡΡ‚ΡŒ какая-Ρ‚ΠΎ рСализация. И Π½Π΅ Π²Π΅Π·Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ всСгда Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ. НапримСр Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ: System.out.println("The number is " + 8); ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹ΡˆΠ΅ компилятором Π±ΡƒΠ΄Π΅Ρ‚ соптимизирован Π² ΠΎΠ΄Π½Ρƒ строку. Π’ΠΎ Π΅ΡΡ‚ΡŒ словно Π²Ρ‹ написали Β«The number is 8Β». И Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ:
public static void main(String[] args) {
    System.out.println("The number is " + Math.abs(-2));
}
Как ΠΆΠ΅ Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас println ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ строки. Бтроки… Π΄Π°, ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому Π½Π΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ, ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ. Π£ Integer Π΅ΡΡ‚ΡŒ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… уровня package. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ ΠΈΡ… Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π° Π²ΠΎΡ‚ Π² самой Java ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΊΠΎΠΉ случай. Π‘ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ getChars, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ· числа Π΄Π΅Π»Π°Π΅Ρ‚ массив символов. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Java ). Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² любой нСпонятной ситуации стоит просто ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Ρ…ΠΎΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π° встанСт Π½Π° свои мСста.