Иногда вам может понадобиться пройти целыми чтобы иметь возможность изменить его значение. "целое" всегда передается по значению в Java. Самый простой способ перейти по ссылке на использование одного элемента массива.


int[] a = new int[1];

a[01;

add2(a);

// a[0] now = 3

...



void add2(int[] a) {

    a[0= a[02;

}

В компьютерной науке, объединить те или слияния является алгоритм сортировки для перестройки списках (или любая другая структура данных, которые могут быть доступны только последовательно, например, файловые потоки) в определенном порядке. Это особенно хороший пример того, разделяй и властвуй "алгоритмической парадигме. Это сравнение рода.

Концептуальном, сортировка слиянием работает следующим образом:

  1. Divide the unsorted list into two sublists of about half the size
  2. Sort each of the two sublists
  3. Merge the two sorted sublists back into one sorted list.

Алгоритм был изобретен Джон фон Нейман в 1945 году.

Следующий код показывает, как осуществлять слияние сортировки в Java.


    /**

     * Mergesort algorithm.

     @param a an array of Comparable items.

     */

    public static void mergeSortComparable [ ] ) {

        Comparable [ ] tmpArray = new Comparablea.length ];

        mergeSorta, tmpArray, 0, a.length - );

    }

    

    /**

     * Internal method that makes recursive calls.

     @param a an array of Comparable items.

     @param tmpArray an array to place the merged result.

     @param left the left-most index of the subarray.

     @param right the right-most index of the subarray.

     */

    private static void mergeSortComparable [ ] a, Comparable [ ] tmpArray,

            int left, int right ) {

        ifleft < right ) {

            int center = left + right 2;

            mergeSorta, tmpArray, left, center );

            mergeSorta, tmpArray, center + 1, right );

            mergea, tmpArray, left, center + 1, right );

        }

    }

    

    /**

     * Internal method that merges two sorted halves of a subarray.

     @param a an array of Comparable items.

     @param tmpArray an array to place the merged result.

     @param leftPos the left-most index of the subarray.

     @param rightPos the index of the start of the second half.

     @param rightEnd the right-most index of the subarray.

     */

    private static void mergeComparable [ ] a, Comparable [ ] tmpArray,

            int leftPos, int rightPos, int rightEnd ) {

        int leftEnd = rightPos - 1;

        int tmpPos = leftPos;

        int numElements = rightEnd - leftPos + 1;

        

        // Main loop

        whileleftPos <= leftEnd && rightPos <= rightEnd )

            ifaleftPos ].compareToarightPos ] ) <= )

                tmpArraytmpPos++ = aleftPos++ ];

            else

                tmpArraytmpPos++ = arightPos++ ];

        

        whileleftPos <= leftEnd )    // Copy rest of first half

            tmpArraytmpPos++ = aleftPos++ ];

        

        whilerightPos <= rightEnd )  // Copy rest of right half

            tmpArraytmpPos++ = arightPos++ ];

        

        // Copy tmpArray back

        forint i = 0; i < numElements; i++, rightEnd-- )

            arightEnd = tmpArrayrightEnd ];

    }

Этот совет Java иллюстрирует метод выполнения команд из кода. Это очень полезно в тех случаях, когда разработчик хочет, чтобы выполнить какой-либо файл (например. EXE) или запустить какую-либо команду в командной строке, но без перерыва на пользователя.


try {

    // Execute a command without arguments

    String command = "ls";

    Process child = Runtime.getRuntime().exec(command);

    

    // Execute a command with an argument

    command = "ls /tmp";

    child = Runtime.getRuntime().exec(command);

catch (IOException e) {

}



// In case developer wants to execute a command with more than 

// one argument, it is necessary to use the overload that requires 

// the command and its arguments to be supplied in an array:



try {

    // Execute a command with an argument that contains a space

    String[] commands = new String[]{"grep""hello world""/tmp/f.txt"};

    

    commands = new String[]{"grep""hello world"

            "c:\\Documents and Settings\\f.txt"};

            

    Process child = Runtime.getRuntime().exec(commands);

    

catch (IOException e) {

}

Статический метод является методом, который принимает аргумент, вместо использования переменных экземпляра.

Противоположное статические методы, например метод.

По умолчанию метод должен быть методом экземпляра. Методы должны быть четко определены как статические методы.

Статический метод также называется методом класса.

Вы когда-нибудь найти себя в такую ситуацию? Вы должны пройти во многих случаях и того же типа объекта метода, но вы не знаете, во время компиляции, сколько экземпляров будет. В прошлом, единственным способом справиться с этой ситуацией было расслоение этих объектов в массиве или другие коллекции. Вместе с J2SE 5.0, теперь у вас есть дополнительное удобство использования переменных параметров арность, менее формально известный как varargs. В этот совет, вы узнаете, почему это хорошая идея, чтобы воспользоваться varargs как клиент API. Подсказка также предостерегает против введения varargs к API, что вы можете создавать, если это оправдано его.

Давайте начнем с примера, который иллюстрирует использование varargs. В следующей программе VarGreeter, метод printGreeting () принимает неопределенного числа объектов String в качестве входных данных. Об этом свидетельствует использование Многоточие в декларации параметра String … имена. В целом, метод может иметь не более одного параметра, который является vararg, он должен быть последним параметром принятым методом, и оно обозначается тип объекта, набор эллипсов (…), а имя переменной.


  class VarGreeter {



       public static void printGreeting(String... names) {

          for (String n : names) {

              System.out.println("Hello " + n + ". ");

          }

       }



       public static void main(String[] args) {

          printGreeting("Paul""Sue");

       }

   }

В VarGreeter, метод printGreeting () вызывается с призывом printGreeting ( "Поле", "Сью"). Если вы запустите VarGreeter, вы получите сообщение:

Hello Paul.
Hello Sue.

Измените строку в VarGreeter которая требует printGreeting (), чтобы иметь столько объект String аргументы, как вам нравится. Каждое имя, которое вы передаете в встретит. PrintGreeting () работает себе путь через любые коллекции строк прошло, и встречает каждый по очереди. Что, пожалуй, наиболее ярким является то, что это работает, если прошло не строка. Вы можете убедиться в этом, основные изменения () на следующую, и провести повторное VarGreeter.


   public static void main(String[] args) {

    printGreeting();

   }

На этот раз у вас не будет выхода, потому что никто не приветствовать. Этот пример иллюстрирует использование соответствующих varargs. Вы не указано количество объектов строк в процессе таким же образом.

Во время компиляции vararg преобразуется в массив. Вы можете видеть, что printGreeting () использует улучшенный цикл для итерации по массиву. Использование vararg отличается использованием массива. Следующие несколько примеров подчеркивают сходства и различия. Сначала рассмотрим VarGreeter2:


   public class VarGreeter2 {

      public static void printGreeting(String... names) {

          for (String n : names) {

              System.out.println("Hello " + n + ". ");

          }

      }



      public static void main(String[] args) {

          printGreeting(args);

      

   }

Главное то, что вы можете передать в массив в качестве параметра. Аргументы переменная представляет собой массив типа String. Выполнить эту версию с помощью команды:

java VarGreeter2 Paul Sue

и вы получите тот же результат, как и прежде:

Hello Paul.
Hello Sue

Вы можете экспериментировать с различным числом аргументов командной строки. Вы даже можете перейти в не аргументы. Обычно, вам нужен охранник пункт, чтобы убедиться, что аргументы не имеют нулевой длины. При необходимости, вы должны проверить правильность ввода. В этом случае, нет такого требования. PrintGreeting () метод может обрабатывать нуля или более строк, передаваемых в виде списка строк или передается в качестве одного массив строк.

Теперь рассмотрим VarGreeter3. Здесь вы увидите, что вы даже можете изменить подписания основного (). Хотя нет никаких оснований для этого, канонической общественности статической Void Main (string [] аргументы) может быть изменен на статический общественности Void Main (string … аргументы):


   public class VarGreeter3 {



       public static void printGreeting(String... names) {

          for (String n : names) {

               System.out.println("Hello " + n + ". ")

          }

       }



       public static void main(String... args) {

          printGreeting(args);

       }

   }

Запуск VarGreeter3 с помощью команды:

java VarGreeter3 Paul Sue

и вы получите тот же результат, как и прежде:

Hello Paul.
Hello Sue.

Использование "Основной (String. .. аргументы)" легче ссылаться непосредственно из основных Java. Это может быть полезным для написания юнит-тестов вашего основного () метод.

До сих пор вы не видели никакой разницы между явным объявлением printGreeting (), используя varargs и использование массива. Теперь пришло время посмотреть на разницу. Изменить подпись printGreeting (String … имена) до printGreeting (String [] имена). Заметьте, что в VarGreeter4, вы можете перейти в массив строк с призывом printGreeting (аргументы):


   public class VarGreeter4 {



       public static void printGreeting(String[] names) {

          for (String n : names) {

              System.out.println("Hello " + n + ". ")

          }

       }



       public static void main(String... args) {

          printGreeting(args);

       }

   }

Вы по-прежнему получать те же результаты как и прежде, если вы выполните команду:

java VarGreeter4 Paul Sue

Разница, если вы попробуете вызвать printGreeting помощью что-то вроде printGreeting ( "Поле", "Сью"), как показано в VarGreeter5:


   public class VarGreeter5 {



       public static void printGreeting(String[] names) {

          for (String n : names) {

              System.out.println("Hello " + n + ". ");

          }

       }



       public static void main(String... args) {

          printGreeting("Paul""Sue")

       }

   }

Попробуйте откомпилировать VarGreeter5. Он не будет компилироваться:

javac VarGreeter5.java
VarGreeter5.java:10: printGreeting(java.lang.String[]) in
VarGreeter5 cannot be applied to
(java.lang.String,java.lang.String)
printGreeting("Paul", "Sue");
^
1 error

Урок заключается в том, что varargs дать вам большую свободу действий, что и клиент из API.

Внимание: Следующие примеры иллюстрируют некоторые из опасностей, представляя varargs к API. Это не менее важно знать, когда нецелесообразно использовать технику, как это знать, когда его использовать.

GridLayout класс имеет три конструктора, один принимает четыре аргумента, один принимает два аргумента, а один не принимает аргументов. Конструктор с двумя аргументами позволяет пользователю указать количество строк и столбцов в результате сетке. Конструктор с четырьмя аргументы также дает пользователю возможность указать размер горизонтальный разрыв между рядами и размеры вертикального разрыва между колоннами. Два аргумента конструктора принимает эти ценности к нулю. Конструктор без аргументов предоставляет по умолчанию для количества строк и столбцов. Следующая программа, PreVarGridLayout, представляет собой упрощенную класс с трех конструкторов, которые определяются во многом так же, как и для GridLayout класс:


   class PreVarGridLayout {



      PreVarGridLayout() {

         this(11);

      }



      PreVarGridLayout(int rows, int cols) {

         this(rows, cols, 00);

      }  



      PreVarGridLayout(int rows, int cols, int hgap, int vgap) {

         System.out.println("Create a grid with rows = "

         + rows + " and cols = " + cols + ", the hgap = "

         + hgap + " and the vgap = " + vgap + ".");

      }



      public static void main(String[] args) {

         System.out.println("Call no arg constructor:");

         new PreVarGridLayout();

         System.out.println("Call two arg constructor: 2,3");

         new PreVarGridLayout(23);

         System.out.println

            ("Call four arg constructor: 4,5,6,7");

         new PreVarGridLayout(4567);

      }

   }

В основной (), вы можете видеть, что называется каждый конструктор. Если вы запустите PreVarGridLayout, вы получите следующий результат:

Call no arg constructor:
Create a grid with rows = 1 and cols = 1, the hgap = 0 and
the vgap = 0.
Call two arg constructor: 2,3
Create a grid with rows = 2 and cols = 3, the hgap = 0 and
the vgap = 0.
Call four arg constructor: 4,5,6,7
Create a grid with rows = 4 and cols = 5, the hgap = 6 and
the vgap = 7.

Вы можете превратить программу, чтобы воспользоваться varargs, как показано в VarGridLayout:


   public class VarGridLayout {

   

      VarGridLayout(Integer... size) {

         Object temp[] {1,1,0,0};

         System.arraycopy(size, 0, temp, 0, size.length);

         System.out.printf("Create a grid with rows = %d " +

         "and cols = %d, the hgap = %d and the vgap = " +

         "%d. \n", temp);

      }

   

      public static void main(String[] args) {

         System.out.println("Call no arg constructor:");

         new VarGridLayout();

         System.out.println("Call two arg constructor: 2,3");

         new VarGridLayout(23);

         System.out.println(

            "Call four arg constructor: 4,5,6,7");

         new VarGridLayout(4567);

      }

    }

Есть никаких изменений в основные (), поэтому конструкторы называют в то же время в VarGridLayout как они были в PreVarGridLayout, то есть до введения varargs. Разница в том, что теперь существует единая конструктор. Конструктор принимает нуля, два или четыре аргумента как прежде и печатает тот же результат. Обратите внимание, что на этот раз Е () используется для записи в выходной поток. Е () использует объект varargs. Это позволяет вам перейти в темпе в качестве последнего параметра Е (). Метод лечит Темп как массив типа Integer.

Но есть одна серьезная проблема в использовании varargs таким образом. Вы можете видеть проблему, изменив последнюю строку из основных () в PreVarGridLayout к:

new PreVarGridLayout(4,5,6,7,8);

и в VarGridLayout к:

new VarGridLayout(4,5,6,7,8);

Перекомпилируйте PreVarGridLayout:

javac PreVarGridLayout.java
PreVarGridLayout.java:23: cannot find symbol
symbol  : constructor PreVarGridLayout(int,int,int,int,int)
location: class PreVarGridLayout
new PreVarGridLayout(4,5,6,7,8);
^
1 error

Вы получите ошибку компиляции, потому что подпись не соответствует ни одному из имеющихся конструкторов PreVarGridLayout. В самом деле, если вы используете IDE с кодом смысле она должна быть в состоянии сигнала до компиляции, что этого не будет компилироваться.

Теперь скомпилируйте VarGridLayout. Вы не получите предупреждений во время компиляции, потому что ваш конструктор может принимать ноль или более Integer объекты в качестве параметров. Если вы запустите VarGridLayout, вы получите ArrayIndexOutOfBoundsException.

Вы могли бы предоставить чек, который size.length либо равна нулю, два или четыре, и бросить свой собственный исключением иначе. Дело в том, что в результате этой проверки оставляется вам, оно не исполняется компилятором. Это означает, что разработчикам, использующим код не будет иметь поддержки в процессе компиляции или письменной время для принятия правильных вызовов. Такой урок не varargs использовать для этой цели.

Другим вопросом является использование varargs зная, какой метод будет вызываться, если, как представляется, конкурирующие подписей. В следующем классе, WhichOne, есть три конструкторов. Первый конструктор принимает vararg аргумент, второй принимает два аргумента Int, а третье занимает два целочисленных аргументов:


   public class WhichOne {





      WhichOne(Integer... size) {

         System.out.println("Var Args version.");

      }



      WhichOne(int i, int j) {

         System.out.println("Version with int args.");



      }



      WhichOne(Integer i, Integer j) {

         System.out.println("Version with Integer args.");

      }



      public static void main(String[] args) {

         System.out.println("Call w/ two arg:2,3");

         new WhichOne(23);

         System.out.println("Call w/ Integer two arg: 2,3");

         new WhichOne(new Integer(2)new Integer(3));

      }



   }

Запуск WhichOne, и вы увидите следующее сообщение:

Call w/ two arg:2,3
Version with int args.
Call w/ Integer two arg: 2,3
Version with Integer args.

Даже с varargs версию конструктора, наиболее конкретно-называется соответствие конструктор. Исключить второе и третье конструкторов, чтобы WhichOne выглядит следующим образом:


   public class WhichOne {





      WhichOne(Integer... size) {

         System.out.println("Var Args version.");

      }



      public static void main(String[] args) {

         System.out.println("Call w/ two arg:2,3");

         new WhichOne(23);

         System.out.println("Call w/ Integer two arg: 2,3");

         new WhichOne(new Integer(2)new Integer(3));

      }



   }

Перезапуск WhichOne. Вы должны увидеть следующее сообщение:

Call w/ two arg:2,3
Var Args version.
Call w/ Integer two arg: 2,3
Var Args version.

В отсутствие более конкретных строителей, varargs версия называется обеих новых WhichOne (2,3) и новым WhichOne (новая Integer (2), Нью-Integer (3)). Она играет важную роль в построении API, чтобы дать понять клиенту, как вызвать желаемый метод. Такой урок здесь избегать использования varargs на перегруженных методов.

Следует повторить, что преимущества использования varargs является то, что в качестве клиента по API, вы можете вызвать метод с помощью последовательности экземпляров объектов определенного типа или массив. У вас есть свобода для посылки вызова с помощью любого количества экземпляров этого типа. Есть также опасность использования varargs. Возможно, вы захотите, чтобы избежать предоставления методах, которые используют varargs, когда важно, чтобы указать количество записей или для предотвращения autoboxing.

Для получения дополнительной информации о varargs см. документ Varargs.

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

Java Runtime система выполняет асинхронный сбор мусора в зависимости от имеющихся ресурсов. Если больше нет ссылки на объект, объект завершен и когда мусор начинает коллекций этих объектах завершены получает собраны.

Иногда вам нужно запустить сборщик мусора явным перед некоторыми памяти интенсивных задач. Вы можете запустить сборщик мусора по этому заявлению.

System.gc();

Завершение процесса может быть также вызвана явно, с помощью следующего утверждения. После завершения работы над выполнением этого заявления все эти объекты не имеют ведения.

System.runFinalization();

В Java вы должны написать и подготовить программу только один раз. Java на любой платформе будет интерпретировать скомпилированный байт-код в инструкции, понятные конкретного процессора. Однако виртуальная Java-машина обрабатывает только одну инструкцию байт-кода в то время, что делает выполнение медленно. Но с использованием Java точно в срок компилятора на конкретной платформе система компилирует байт-код в частности код системы. После код был (перерегистрации), составленная компилятор, то она обычно быстрее запускать на компьютере.

Точно в срок компилятор поставляется с JVM и используются факультативно. В нем скомпилированы в байт-код для конкретной платформы исполняемого кода, который немедленно казнены. JIT компилятору опцию следует использовать, особенно если метод исполняемого многократно использоваться в коде.

Подкласса Java представляет собой класс, который наследует метод или методы из суперкласса Java.

Класс Java может быть как подкласс, суперкласса, оба или ни одной!

Класс Cat в следующем примере подкласса и класса животного является суперкласса.


public class Animal {



    public static void hide() {

        System.out.println("The hide method in Animal.");

    }



    public void override() {

        System.out.println("The override method in Animal.");

    }

}



public class Cat extends Animal {



    public static void hide() {

        System.out.println("The hide method in Cat.");

    }



    public void override() {

        System.out.println("The override method in Cat.");

    }



    public static void main(String[] args) {

        Cat myCat = new Cat();

        Animal myAnimal = (Animal)myCat;

        myAnimal.hide();

        myAnimal.override();

    }

}

Хотя язык программирования 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
Все права защищены.

Банк файла архива Java которая представляет собой набор файлов класса.

JAR-файлы упакованы с форматом ZIP, так что вы можете открыть. JAR-файлы с обычной программой распаковать!