Типы данных в Java можно разделить на две категории:
1. Базовые типы данных, также называемые примитивными типами данных. Чтобы сравнить byte, short, char, int, long, float, double, boolean, используйте двойной знак равенства (==) и сравните их значения.
2. Составные типы данных (классы). Когда они сравниваются с помощью (==), они сравниваются с адресами их хранения в памяти. Поэтому, если они не являются одним и тем же новым объектом, результат их сравнения является истинным, в противном случае сравнение. результат ложный. Все классы в JAVA наследуются от базового класса Object. Базовый класс в Object определяет метод равенства. Первоначальное поведение этого метода заключается в сравнении адресов объектов в памяти. Однако в некоторых библиотеках классов этот метод переопределен, например String. , Integer и Date, функция равенства имеет собственную реализацию в этих классах вместо сравнения адреса хранения класса в куче памяти. При сравнении составных типов данных методом равенства, без переопределения метода равенства, сравнение между ними по-прежнему основано на значении адреса их места хранения в памяти, поскольку метод равенства объекта также использует двойной знак равенства (==). , поэтому результат сравнения тот же, что и результат двойного знака равенства (==).
Скопируйте код кода следующим образом:
общественный класс TestString {
publicstaticvoid main(String[] args) {
Строка s1="Понедельник";
Строка s2="Понедельник";
если (s1 == s2)
{
System.out.println("s1 == s2");}
еще{
System.out.println("s1 != s2");}
}
}
Скомпилируйте и запустите программу, выведите: s1 == s2 Примечание: s1 и s2 относятся к одному и тому же объекту String — «Понедельник» 2. Если немного изменить программу, то обнаружится нечто еще более странное:
Скопируйте код кода следующим образом:
общественный класс TestString {
publicstaticvoid main(String[] args)
{
Строка s1="Понедельник";
String s2 =new String("Понедельник");
if (s1 == s2) {System.out.println("s1 == s2");
}
еще
{
System.out.println("s1 != s2");
}
если (s1.equals(s2))
{
System.out.println("s1 равно s2");
}
еще
{
System.out.println("s1 не равно s2");
}
}
}
Мы используем новый оператор для создания вывода программы для s2: s1 != s2 s1 равно s2 Примечание. s1 и s2 относятся к двум строковым объектам «Monday» соответственно.
3. Пул буферов строк. Оказывается, программа создает пул буферов строк во время работы. При использовании такого выражения, как s2 = «Monday», для создания строки программа сначала будет искать то же значение в строке. буферный пул. В первой программе s1 сначала был помещен в пул, поэтому при создании s2 программа нашла s1 с тем же значением и ссылалась на s2 на объект «Понедельник», на который ссылается s1. Используя новый оператор, он четко говорит программе: «Я хочу новый! Не старый!» Итак, в памяти создается новый объект Sting «Понедельник». Их значения одинаковы, но локации разные, один плавает в бассейне, а другой отдыхает на берегу. Упс, какая пустая трата ресурсов. Почему мы должны их разделять, если они очевидно одинаковы?
4. Снова измените программу:
Скопируйте код кода следующим образом:
общедоступный класс TestString
{
publicstaticvoid main(String[] args)
{
Строка s1="Понедельник";
String s2 =new String("Понедельник");
s2 = s2.intern();
если (s1 == s2)
{
System.out.println("s1 == s2");
}
еще
{
System.out.println("s1 != s2");
}
если (s1.equals(s2))
{
System.out.println("s1 равно s2");
}
еще
{
System.out.println("s1 не равно s2");
}
}
}
На этот раз добавлено: s2 = s2.intern(); Вывод программы: s1 == s2 s1 равно s2 Оказывается, что (метод intern() java.lang.String "abc".intern() возвращаемое значение по-прежнему является строкой). «abc», на первый взгляд кажется, что этот метод бесполезен, но на самом деле он делает небольшой трюк: проверяется, есть ли в пуле строк строка типа «abc», и если она существует, возвращает значение. строка в пуле; если она не существует, этот метод добавит «abc» в пул строк и затем вернет ссылку на нее).