Тестирование с использованием оберточных классов
На этом этапе мы рассмотрим, как работает сравнение на равенство с оберточными классами Java. Оберточные классы - это специальные классы, которые позволяют использовать примитивные типы данных (например, int
, double
, boolean
) как объекты. Например, оберточным классом для int
является Integer
, а для double
- Double
.
При сравнении объектов в Java оператор ==
проверяет, ссылаются ли две переменные на один и тот же объект в памяти, а не на то, равны ли их значения. Чтобы сравнить значения объектов, вы должны использовать метод equals()
.
Давайте посмотрим, как это применяется к оберточным классам.
-
Откройте файл HelloJava.java
в редакторе WebIDE.
-
Замените существующий код следующим:
public class HelloJava {
public static void main(String[] args) {
Integer intObj1 = new Integer(100);
Integer intObj2 = new Integer(100);
Integer intObj3 = intObj1; // intObj3 refers to the same object as intObj1
System.out.println("Comparing Integer objects with ==:");
if (intObj1 == intObj2) {
System.out.println("intObj1 == intObj2 is true");
} else {
System.out.println("intObj1 == intObj2 is false");
}
if (intObj1 == intObj3) {
System.out.println("intObj1 == intObj3 is true");
} else {
System.out.println("intObj1 == intObj3 is false");
}
System.out.println("\nComparing Integer objects with equals():");
if (intObj1.equals(intObj2)) {
System.out.println("intObj1.equals(intObj2) is true");
} else {
System.out.println("intObj1.equals(intObj2) is false");
}
if (intObj1.equals(intObj3)) {
System.out.println("intObj1.equals(intObj3) is true");
} else {
System.out.println("intObj1.equals(intObj3) is false");
}
}
}
В этом коде:
- Мы создаем два объекта
Integer
, intObj1
и intObj2
, с одинаковым значением (100
) с использованием new Integer()
. Это создает два отдельных объекта в памяти.
- Мы создаем
intObj3
и присваиваем ему intObj1
. Это означает, что intObj3
и intObj1
теперь ссылаются на один и тот же объект в памяти.
- Мы используем
==
для сравнения intObj1
с intObj2
и intObj3
.
- Мы используем метод
equals()
для сравнения значений intObj1
с intObj2
и intObj3
.
-
Сохраните файл (Ctrl+S или Cmd+S).
-
Скомпилируйте программу в терминале:
javac HelloJava.java
-
Запустите скомпилированную программу:
java HelloJava
Вывод должен быть таким:
Comparing Integer objects with ==:
intObj1 == intObj2 is false
intObj1 == intObj3 is true
Comparing Integer objects with equals():
intObj1.equals(intObj2) is true
intObj1.equals(intObj3) is true
Этот вывод четко показывает разницу:
intObj1 == intObj2
равно false
, потому что они - разные объекты в памяти, даже если их значения одинаковы.
intObj1 == intObj3
равно true
, потому что они ссылаются на один и тот же объект.
intObj1.equals(intObj2)
равно true
, потому что метод equals()
сравнивает значения объектов, которые оба равны 100.
intObj1.equals(intObj3)
также равно true
, потому что они ссылаются на один и тот же объект, и их значения одинаковы.
Важное примечание: Для небольших целочисленных значений (обычно от -128 до 127) Java использует кэш для объектов Integer
. Это означает, что Integer intObjA = 50; Integer intObjB = 50;
может привести к тому, что intObjA == intObjB
будет true
, потому что они могут ссылаться на один и тот же кэшированный объект. Однако полагаться на это кэширование при проверках на равенство не рекомендуется. Всегда используйте метод equals()
для сравнения значений объектов оберточных классов.
Этот этап подчеркивает важную разницу между сравнением примитивных типов и объектов в Java и важность использования метода equals()
для сравнения значений объектов.