проверка кода
public class IntegerTest {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);
}
}
Результат выполнения приведенного выше кода:
true false
Во-первых, когда мы компилируем приведенный выше тестовый код в байт-код (.class), закодированный код выглядит следующим образом:
public class IntegerTest {
public static void main(String[] paramArrayOfString) {
Integer integer1 = Integer.valueOf(127);
Integer integer2 = Integer.valueOf(127);
System.out.println((integer1 == integer2));
Integer integer3 = Integer.valueOf(128);
Integer integer4 = Integer.valueOf(128);
System.out.println((integer3 == integer4));
}
}
Видно, что он использовался при создании IntegervalueOf
, исходный код его реализации выглядит следующим образом:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Из приведенного выше исходного кода видно, что в этом методе используется IntegerCache Исходный код IntegerCache выглядит следующим образом:
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
Как видно из приведенного выше исходного кода, когда значение Integer находится в диапазоне от -128 до 127, он будет повторно использовать существующий объект, поэтому значение будет истинным, когда i1 (127) и i2 сравниваются с использованием ==, и когда значение становится 128, результат выполнения ложный.
На самом деле соответствующие правила есть в «Руководстве по разработке Java» от Alibaba.
[Обязательно] Все сравнения значений между объектами целочисленного класса-оболочки используют метод equals.
Объяснение: Для назначения Integer var = ? между -128 и 127 объект Integer генерируется в IntegerCache.cache, Существующие объекты будут использоваться повторно.Целые значения в этом диапазоне можно напрямую судить по ==, но все данные за пределами этого диапазона будут Он будет сгенерирован в куче и не будет повторно использовать существующие объекты. Это большая яма. Для оценки рекомендуется использовать метод equals.
Меры предосторожности
Мало того, когда мы используем new Integer, независимо от значения, мы не можем использовать сравнение ==, пример кода выглядит следующим образом:
public class IntegerTest {
public static void main(String[] args) {
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);
}
}
Результат выполнения приведенного выше кода:
false
Это связано с тем, что новый метод Integer не использует IntegerCache, а напрямую создает новый объект, поэтому его нельзя сравнивать с ==.
Советы: == используется для прямого сравнения, совпадают ли ссылки двух объектов, а equals используется для сравнения, совпадают ли значения двух объектов.
другие сравнения
compareTo
Поскольку класс Integer реализует интерфейс Comparable, мы можем использовать compareTo для сравнения размера двух значений.Исходный код реализации выглядит следующим образом:
public final class Integer extends Number implements Comparable<Integer> {
// 忽略其他内容
}
Использование compareTo выглядит следующим образом:
public class IntegerTest {
public static void main(String[] args) {
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1.compareTo(i2));
}
}
Результат выполнения приведенного выше кода:
0
Исходный код compareTo выглядит следующим образом:
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
Видно, что есть три возвращаемых значения compareTo: -1, 0, 1, где -1 означает, что предыдущее значение меньше следующего значения; 0 означает, что два значения равны; 1 означает что предыдущее значение больше, чем последнее значение, поэтому мы используем его для сравнения двух целых чисел на равенство.
прямое действие
Метод compareTo дает нам вдохновение. Мы можем напрямую вычесть два значения. Если вычитаемое значение равно 0, это означает, что два сравниваемых значения одинаковы. Пример кода выглядит следующим образом:
public class IntegerTest {
public static void main(String[] args) {
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println((i1 - i2) == 0);
}
}
Результат выполнения приведенного выше кода:
true
intValue
Мы можем использовать intValue для получения значения int Integer, а затем использовать == для сравнения, пример кода выглядит следующим образом:
public class IntegerTest {
public static void main(String[] args) {
Integer i = 558;
Integer i2 = 558;
System.out.println(i.intValue() == i2.intValue());
}
}
Результат выполнения приведенного выше кода:
true
исключающее ИЛИ
XOR — это математический оператор, применяемый к логическим операциям. В компьютере, если два значения a и b не совпадают, результат XOR равен 1; если два значения a и b совпадают, результат XOR равен 0.
Например:
- 1 Исключающее ИЛИ 0=1
- 0 Исключающее ИЛИ 0=0
- 1 Исключающее ИЛИ 1=0
Пример реализации XOR выглядит следующим образом:
public class IntegerTest {
public static void main(String[] args) {
Integer i = 558;
Integer i2 = 558;
System.out.println((i ^ i2) == 0);
}
}
Результат выполнения приведенного выше кода:
true
Расширенные знания: изменение домена значений IntegerCache
Диапазон значений IntegerCache по умолчанию составляет от -128 до 127, но мы можем настроить максимальное значение кэша IntegerCache, установив параметры запуска, например, мы можем настроить параметры запуска виртуальной машины.-XX:AutoBoxCacheMax=1000
, эта конфигурация указывает, что максимальное значение кэша установлено на 1000. Если это Idea, конфигурация выглядит следующим образом:
public class IntegerTest {
public static void main(String[] args) {
Integer i1 = 999;
Integer i2 = 999;
System.out.println(i1 == i2);
}
}
Результат выполнения приведенного выше кода:
true
Из текущего результата видно, что диапазон значений IntegerCache был успешно изменен.
Суммировать
В этой статье мы представляем 6 методов сравнения целых чисел: метод ==, equals, compareTo, прямая операция и метод == нельзя использовать для сравнения целых чисел, он применяется только к определенному диапазону неновых целых чисел (-128~127). , а последние пять методов обычно можно использовать для сравнения целых чисел, среди которых наиболее часто используется метод сравнения равных.
Интерактивная тема
Кроме вышеперечисленных методов сравнения, знаете ли вы другие методы сравнения? Дополнительные комментарии приветствуются в области комментариев.
Обратите внимание на общественный номер»Сообщество китайского языка Java"Подпишитесь, чтобы узнать больше.