Введение в autoboxing

Хотя язык программирования Java является объектно-ориентированным языком, это часто бывает, что при использовании языка вам необходимо работать с примитивных типов. Перед J2SE 5.0, работает с примитивного типа требуют повторяющихся работу преобразования между примитивными типами и обертки классов. В этот совет, вы увидите, как новые autoboxing функцию в J2SE 5.0 Ручка переходов — например, между значениями Int типа и значения типа Integer. Подсказка Также обсуждаются некоторые autoboxing соображения, касающиеся определения, когда два численные значения равны.

5 октября 2004 Технология Tip, форматирования вывода с Новым Formatter обсуждали новый способ форматирования вывод, который похож на Е от языка Си. Например, в котором использованы отзыв Е () для печати неотъемлемую ценность. Вот простой пример, который использует Е () метод:


   public class FormatPrint {

     public static void main(String[] args) {

       System.out.printf("There is only %d thing."1);

     }

   }

Подпись Е () в примере FormatPrint это:

printf(String format, Object... args)

Номер 1 является примитивным и не объект, так что вы можете подумать, что строки:

System.out.printf("There is only %d thing.", 1);

Не следует подготовить. Однако autoboxing заботится о ситуации автоматической упаковки целого значения в соответствующем объекте обертку. В версии J2SE 1.4 вам пришлось бы вручную заверните примитивные значения, используя что-то вроде новой Integer (1).

Еще один пример, где автоматического перехода от примитивного может быть полезно, когда вы используете коллекций API. Коллекция класса предназначены для хранения объектов. Рассмотрим следующий простой пример хранения Int значения от 0 до 9 в ArrayList:


   import java.util.ArrayList;



    public class Autoboxing {

      public static void main(String[] args) {

          ArrayList<Integer> list = new ArrayList<Integer>();

          for(int i = 0; i < 10; i++){

             list.add(i);

          }

      }

    }

Сопоставимой программы для J2SE 1.4.2 будут распределены следующим образом:


   import java.util.ArrayList;



   public class ManualBoxing {

     public static void main(String[] args) {

        ArrayList list = new ArrayList();

        for(int i = 0; i < 10; i++){

            list.add(new Integer(i));

        }

     }

   }

С ManualBoxing нужно явно создать объект, используя Integer list.add (новая Integer (I)). Сравните это с Autoboxing, где я это Int autoboxed на объект целое число в строке list.add (I).

Autoboxing хорошо работает с другими новыми функциями J2SE 5.0. Например, функция позволяет autoboxing бесшовной интеграции между общими типами и примитивных типов. В примере ManualBoxing, элементов ArrayList имеют тип объекта. Для сравнения, в примере Autoboxing, элементы списка имеют тип Integer.

Давайте расширим Autoboxing примером для перебора элементов ArrayList и вычислить их сумму. Обратите внимание, что эта новая версия также использует новые J2SE 5.0 улучшенный цикл для перебора элементов.


   import java.util.ArrayList;

   

     public class Autoboxing {

       public static void main(String[] args) {

           ArrayList<Integer> list = new ArrayList<Integer>();

           for(int i = 0; i < 10; i++){

              list.add(i);

           }

           int sum = 0;

          for Integer j : list){

            sum += j;

          }

         System.out.printf("The sum is %d.", sum );

       }

     

Autoboxing используется в ряде мест в обновленном Autoboxing пример. Во-первых, Интс зажаты в целые числа, как они будут добавлены в ArrayList. Тогда Целые Unboxed к Интс, которые будут использоваться при расчете суммы. Наконец, представляющих Int суммы коробочного для использования в Е () заявление.

Прозрачность упаковки и распаковки делает autoboxing проста в использовании. Однако при использовании autoboxing функция требует некоторой осторожности. В частности, тестирование на равенстве объектов, созданных autoboxing не то же самое, как тестирование на равенстве объектов, которые не создаются autoboxing. Чтобы убедиться в этом, посмотрите на следующий BoxingEquality класс:


   import java.util.ArrayList;

   

     public class BoxingEquality {

       public static void main(String[] args) {

          int i = 2;

          int j = 2;

          ArrayList <Integer> list = new ArrayList<Integer>();

          list.add(i);

          list.add(j);

          System.out.printf("It is %b that i ==j.\n",

                            (i==j))//(1)

          System.out.printf("It is %b that " +

                            "list.get(0) == list.get(1).\n",

                            list.get(0)==list.get(1))//(2)

          System.out.printf("It is %b that " +

                         "list.get(0).equals(list.get(1)).",

                         list.get(0).equals(list.get(1)))//(3)

        }

     

Первое выступление в печати BoxingEquality сравнивает равенства примитивов я и Я. Второе заявление для печати сравнивает равенства объектов, созданных autoboxing I и J. Третий оператор печати сравнивает значения объектов, созданных autoboxing I и J. Можно ожидать, что первое и третье заявления для печати, чтобы вернуться верно, но как насчет второго? Вывод BoxingEquality Запуск программы:

It is true that i ==j.
It is true that list.get(0) == list.get(1).
It is true that list.get(0).equals(list.get(1)).

Теперь измените значения I и J в 2000 году.


   import java.util.ArrayList;



   public class BoxingEquality {

     public static void main(String[] args) {

       int i = 2000;

       int j = 2000;

       // . . .

   }

Сохраните, перекомпилировать и перезапустить BoxingEquality. На этот раз результаты разные:

It is true that i ==j.
It is false that list.get(0) == list.get(1).
It is true that list.get(0).equals(list.get(1)).

Первобытные люди равны и значения коробочной Интс равны. Но на этот раз Интс указывают на различные объекты. То, что вы обнаружили, что для малого интегральные значения, объекты будут сохраняться в бассейне так же, как струны. Когда я и J являются 2, один объект указан от двух разных местах. Когда я и J являются 2000, на которые ссылаются две отдельные объекты. Autoboxing гарантировано возвращение того же объекта для целых значений в диапазоне [-128, 127], но реализация может по своему усмотрению, кэшем значений за пределами этого диапазона. Было бы плохо, стиль полагаться на эту кэширования в вашем коде.

В самом деле, тестирование на объекте равенства помощью \u003d\u003d это, конечно, не то, что обычно вы намерены это сделать. Это поучительным примером включена в этот отзыв, потому что легко потерять след ли вы имеете дело с объектами или примитивами, когда компилятор делает ее легкой для вас двигаться вперед и назад между ними.

Более подробную информацию о autoboxing см. Autoboxing.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>