Тест 1:
Давайте сначала посмотрим на набор сравнений типа строки. Без лишних слов просто введите код:
открытый тест класса {public static void main (string [] args) {String a = "Java Book Garden"; Строка B = "Java Book Garden"; String C = новая строка ("Java Book Garden"); String D = New String ("Java Book Garden"). Nevan (); if (a == b) {System.out.println ("a == b"); } else {System.out.println ("a! = b"); } if (a.equals (b)) {System.out.println ("a.equals (b)"); } else {System.out.println ("! A.Equals (b)"); } if (a == c) {System.out.println ("a == c"); } else {System.out.println ("a! = c"); } if (a.equals (c)) {System.out.println ("a.equals (c)"); } else {System.out.println ("! A.Equals (c)"); } if (a == d) {System.out.println ("a == d"); } else {System.out.println ("a! = D"); } if (a.equals (d)) {System.out.println ("a.equals (d)"); } else {System.out.println ("a.equals (d)"); }}}Результат вывода:
a == ba.equals (b) a! = ca.equals (c) a == da.equals (d)
Суммировать:
Результат A == B: Когда программа работает, она создаст пул строковых буферов. Когда строка a = "Java Book Garden", «Java Book Garden» помещается в бассейн буфера. Когда строка b = "Java Book Garden" создает строку, программа сначала будет искать объекты с тем же значением в этом бассейне буфера. Следовательно, когда B создается, программа находит A с тем же значением и ссылается на объект, на который ссылаются A. Следовательно, A и B относятся к одному и тому же объекту, так что A == b.
В результате A! = C: String C = New String ("Java Book Garden") Новый новый объект, поэтому он не искал из бассейна буфера String и напрямую создает новый объект. Так что! = C.
Результат a == D: Когда вызывается метод стажера, если пул уже содержит строку, равную этому строковому объекту (объект определяется методом Equals (Object)), возвращается строка в пуле. В противном случае добавьте этот объект строки в пул и возвращает ссылку на этот объект строки. Все D вызывает объекты.
равные сравнивают значения, поэтому, когда значения одинаковы, они равны.
Тест 2:
Вот тест набора типов INT и типов целочисленных целых чисел:
открытый тест класса {public static void main (string [] args) {int a = 127; int a1 = 127; int b = 128; целое число C = 127; Целое число C1 = 127; Целое число d = 128; Целое число D1 = 128; if (a == a1) {System.out.println ("a == a1"); } else {System.out.println ("a! = a1"); } if (b == b1) {System.out.println ("b == b1"); } else {System.out.println ("b! = b1"); } if (c == c1) {System.out.println ("c == c1"); } else {System.out.println ("c! = C1"); } if (d == d1) {System.out.println ("d == d1"); } else {System.out.println ("D! = D1"); }}}Результат вывода:
a == a1b == b1c == c1d! = D1
Результат «a == a1» и «b == b1»: int являются основными типами, а значения хранятся напрямую, в то время как целое число является объектом и указывает на этот объект с помощью ссылки. Большинство сравнений сделаны из «a == a1» и «b == b1».
Результаты «C == C1» и «D! = D1» могут иметь здесь вопросы, почему «D! = D1». Давайте посмотрим на исходный код целого числа вместе.
/** * Кэш для поддержки семантики идентификации объекта автобоксировки для значений между * -128 и 127 (включительно) в соответствии с требованиями JLS. * * Кэш инициализируется при первом использовании. Размер кэша * может управлять опцией -xx: autoboxcachemax = <Размер>. * Во время инициализации виртуальной машины Java.lang.integer.integercache.high свойство * может быть установлено и сохранено в свойствах частной системы в классе * sun.misc.vm. */ private Static Class IntegerCache {статический конечный int low = -128; Статический финал int High; Статический конечный целочисленный кеш []; static {// высокое значение может быть настроено Property int h = 127; String integercachehighpropvalue = sun.misc.vm.getsavedproperty ("java.lang.integer.integercache.high"); if (integercachehighpropvalue! = null) {int i = parseint (integercachehighpropvalue); i = math.max (i, 127); // максимальный размер массива IS integer.max_value h = math.min (i, integer.max_value -(-low) -1); } high = h; cache = new Integer [(High - low) + 1]; int j = низкий; for (int k = 0; k <cache.length; k ++) cache [k] = новое целое число (j ++); } private integerCache () {}} /** * Возвращает {@code integer} экземпляр, представляющий указанное * {@code int}. Если новый экземпляр {@code Integer} не требуется, этот метод обычно следует использовать в предпочтении * конструктору {@link #integer (int)}, так как этот метод, вероятно, * для получения значительно лучших пространственно -временных и временных характеристик с * кэшированием часто запрашиваемыми значениями. * * Этот метод всегда будет кэшировать значения в диапазоне от -128 до 127, * включительно, и может кэшировать другие значения за пределами этого диапазона. * * @param i a {@code int} значение. * @return a {@code integer} экземпляр, представляющий {@code i}. * @since 1.5 */ public static integer value (int i) {assert integercache.hhigh> = 127; if (i> = integerCache.low && i <= integerCache.high) return integerCache.cache [i + (-integerCache.low)]; вернуть новое целое число (i); }Заключение: Здесь целое число будет инициализировать постоянный пул [-128,127]. Если значение находится в этом диапазоне, упоминается один и тот же объект. Если это не в этом диапазоне, из исходного кода можно увидеть, что возвращаемый новый объект: вернуть новое целое число (i);
Следовательно, результат «C == C1» относится к одному и тому же объекту, и результат «D! = D1» относится к новому новому объекту, поэтому он отличается.