Java для начинающих. Урок 42: Метод equals() и String Pool.
HTML-код
- Опубликовано: 10 фев 2025
- МОЙ НОВЫЙ КУРС: • Мой курс "Продвинутая ...
ПРАКТИКА НА JAVA: java-marathon....
На этом уроке мы научимся сравнивать объекты в java.
Реклама и сотрудничество: alishev.neil@gmail.com
Регистрируйтесь на курс "Продвинутая Java": ruclips.net/video/rRe1vT0SDD8/видео.html
Практикуйтесь в написании Java кода: java-marathon.tilda.ws
Здравствуйте очень хороший урок.
Вопрос
Я могу сравнить строки спомашю if-a нопрмер а место того что бы написать System.out.ptintln(string1.equals(string2))
Написать if(string1.equals(string2))
System.out.println("true")
else System.out.println("folse")
Я так попробовал но else не работает почему?
Как надо писать код?
@@revolt4792 да, так можно делать, потому что метод equls возвращает булевый тип т.е тру или фолс, что и требует условные оператор if, а почему не работает...надо смотреть код, может синтаксическая ошибка или еще что
Алишев, у тебя талант. С тобой становятся понятно то, чего не знал раннее, будто между делом. Бывает, знаешь о чем говорят, но не понимаешь что пытаются донести.
Вы просто молодец. материал подается структурировано, понятно. Рассказано что и зачем. Обязательно куплю Ваш курс.
Лучшие уроки по Java в русскоязычном youtube!
Замечательные уроки)
Огромное спасибо за Ваш труд)
*Обалденно объясняете. Покупал курсы у Сергея Немчинского. Потратил $80 и честно говоря пожалел, потому что ваши уроки бесплатные и гораздо качественнее.*
@sibiryaq5085 а что плохого в русофобии? разве она не заслужена?
@sibiryaq5085 А еще он Россиянин)
а к немцам как относитесь?@@themostrusophobic
@@themostrusophobic Русские утилизируют украинцев, это прекрасно
@@themostrusophobic ну если ты нацист то заслуженна , если ты адекватный человек то ты бы таких вопросов тупых не задавал
Шикарно, спасибо!
Ваш курс "Продвинутая Java" очень помог.
Блин, первый раз услышал про String pool. Спасибо!
Спасибо за Ваш труд! Коммент в поддержку канала.
Спасибо, Наиль. Очень интересно.
Алишев, хорошее объяснение!
просто круто пояснено!
Спасибо, очень детально!
Спасибо за курс java! Все доступно и лаконично!
Довольно понятно, но было бы неплохо так же рассказать про hashCode() и почему лучше его перегружать вместе с equals(). Ну а в equals я бы добавил:
if (this == object)
return true;
if ( !(object instanceof Animal) )
return false;
Обо всем этом есть в моем курсе "Продвинутая Java" - www.udemy.com/javarussia/?couponCode=ADVANCED_JAVARUSSIA
Спасибо большое! Как всегда очень наглядное и доходчивое объяснение!
Так забавно, что еще год назад вы смотрели этот видеокурс и учились. А сейчас я смотрю ваш канал, паралельно с этим курсом.
Никифоров и вам спасибо
Всё чётко и ясно!!!
Офигенное, крутое объединение знаний в удобный видос.
Ещё бы добавить правда инфы про сравнение 2ух объектов, имеющие поля String, а не только int
Потому что мне, например, непонятно обязательство проверки полей двух классов на != null
Спасибо! Интересный материал и подача хорошая!
4:33 Самый сок будет, если добавить
// animal1 --> {1} --> Gf@123 (ссылочный адрес на объект в памяти)
// animal2 --> {1} --> Gf@735 и сразу видно и понятно почему false
Все грамотно, доступно и ясно излагается! Спасибо!
Эх, жалко так мало видео на канале, очень интересно было бы послушать про многопоточность в изложении автора.
Уроки по многопоточности и по коллекциям уже готовы! Более 15 часов материала. В данный момент я проверяю все записанные уроки и исправляю мелкие неточности.
Следите за обновлениями на канале!
Спасибо!
Гениально объяснили:-) Все сразу стало понятно.
Круто, спасибо!
супер доходчиво:)
Вы красавчик.
02.10.2018 Спасииибоооооо за уроки все ясно четко !!
Отличный урок. единственно, что хотелось бы это ещё информациипо методу hashCode()Спасибо!
Метод hashCode() и все, что с ним связано, очень подробно рассматривается в моем курсе "Продвинутая Java".
@@alishevN спасибо за ответ!
спасибо
Косячок 16:13. Правильно последний элемент включительно. И не "5", а "4". Подписка
А я сделал с методом intern() и у меня получилось .
Кстати в конструкции
String val1 = new String ("Hello");
String val2 = new String ("Hello");
boolean val = val1.equals(val2)
Val будет true. Наверное по этой причине ide и ругается. Чтобы вне зависимости от способа объявления объекта не было косяков, что то типо всегда юзайте equals и не мудрите))
А так в целом от души, все как обычно сверх понятно 👋👌
А почему true? Ведь мы сравниваем два отдельных объекта. В начале этого видео в примере с Animal в подобном случае программа возвращала false, хотя структурно объекты были идентичны
Строки сравниваются по байтам, equals по умолчанию в String так работает.
Сначала сравнение идёт по ссылкам, если ссылки равны, то возвращается true. Если нет то строки бьются на 2 массива байтов и сравниваются в обычном for
Классно
Спасибо за труд но почему то компилятор ругался пришлось изменить :
public boolean equals(Object obj){
Animal obj1 = (Animal) obj;
return this.id==obj1.id;
За свой, пока короткий, период обучения смотрел некоторые интервью о программирование и языках программирования. Что ты знаешь о Котлин(вкратце)? Планируешь ли снимать о нём уроки?
Вот более понятный пример сравнения несравнимого:
String str1 = "Hello";
String str2 = "Hell";
str2 += "o";
System.out.println(str1 + " " + str2);
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
__________
Hello Hello
false
true
При конкатенации строк неявно задействуется StringBuilder.
Объясните, пожалуйста, эту строчку:
Animal otherAnimal = (Animal) obj ;
Понимаю, что идет даункастинг, но как и для чего? Не могу уложить в голове, что мы здесь делаем? Зачем понижаемся, что кладем в otherAnimal? Блин, хоть и смотрел апкастинг и даункастинг тут просто не могу врубиться. Можно объяснить каждую букву? Самое главное не понимаю зачем здесь кастить? Почему мы не можем так: return this id == obj.id? Получается, мы имеем право класть в параметры equals только объекты класса Object? Поэтому и спускаемся ниже? То есть мы не можем сравнить animal1.id или animal2.id с obj.id, во первых потому что у obj нет поля id, а во вторых мы не можем сравнивать объекты Animal с объектами Object, так? Я просто думаю раз класс Object отец всех классов, то мы можем в аргументы equals спокойно положить экземпляр класса Animal, но получается нет и нужно спускаться. Начинается ступор )))
Возможно, уже поздно, но может этот ответ будет полезен кому-то другому. Для того, чтобы переопределить метод equals() в классе Object, нам нужно полностью повторить сигнатуру метода, а в сигнатуре метода в аргументы передается именно объект класса Object. То есть мы не можем переопределить метод, передав туда объект другого класса, даже если он наследуется от класса Object. Теперь же, когда мы переопределили метод, нам необходимо передать в него объект класса Object, Но проблема заключается в том, что в классе Object отсутствует поле id, по которому мы хотим провести сравнение. Для того, чтобы провести сравнение, нам нужно передавать объект класса Animal, но тогда, как уже говорил ранее, будет нарушена сигнатура метода и переопределения метода equals() в классе Object не случится. Поэтому мы делаем нисходящее преобразование (downcasting), как бы насильно опускаем объект класса Object до объекта класса Animal, для того, чтобы на этом объекте мы могли использовать поля класса Animal. Резюмируя, можно сказать, что downcasting здесь нужен для того, чтобы у объекта класса Object, который мы передаем в параметры при использовании метода equals(), был доступ к полям класса Animal. Надеюсь, я понятно изложил.
Добрый день, спасибо большое за ваши уроки! Но может мне кто нибудь объяснить суть переопределения equal в этом уроке? Стоит ли когда либо вообще переопределять методы Objecta? В конкретном случае применять downcasting и т.д., когда можно просто создать семантически верный метод equalId (например), и принимать в качестве аргументов сразу Animal, а не Object?
Я конечно понимаю, что вопросу больше года уже, но вдруг его кто-то сейчас прочтет, а ответа все нет.
Стоит это делать как минимум для работы с коллекциями. Например Set может содержать только уникальные объекты. Вы не можете в него положить два одинаковых animal. Но Set не знает, что, оказывается, сравнивать их надо каким-то самодельным методом.
Аналогичная ситуация с List и его методом contains(). Если даже в листе animals лежит animal1, то без переопределения equals() вам метод animals.contains(animal1) вернет false
iyhan SPB спасибо за ответ! Но похоже что в данном виде это нарушает LSP, не так ли?
Viktor Kishankov
lsp??
@@ViktorKishankov я не совсем понял вопрос. В каком "в данном" и как именно нарушает. Переопределение equals&hashCode - стандартная практика
@@iyhan1987 , @man of planet Earth -- Принцип подстановки Лисков (Liskov substitution principle)
«объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы». (Наследующий класс должен дополнять, а не изменять базовый.)
В примере на видео класс Animal переопределяет equals которое использует своё поле id для валидации, но поле которого нет в родителском классе Object. Т.е. наследующий класс изменил базовый, сделав их не совместимы между собой. Например, если мы вызовем equals объекта Animal и аргументом будет класс Object (как и описано в сигнатуре), то возникнет ошибка. Прошу прощения если что-то упустил.
Когда я решаю изменить string1, создается новый объект в string pool?
public static void main(String[] args) {
String string1 = "Hello";
String string2 = "Hello";
string1 = "jfjf";
System.out.println(string2);
}
Почему в последнем примере возвращается false?
Из-за того что сначала создается строка, но потом он изменяется с помощью substring и получается что после этого уже возвращается уже другой объект?
Animal otherAnimal = (Animal) obj; // Данной строкой мы переопределяем тип данных из Object в Animal?
Да
@@igorvasylevskyi3629 Не могу уложить в голове, что мы здесь делаем? Зачем понижаемся, что кладем в otherAnimal? Блин, хоть и смотрел апкастинг и даункастинг, тут просто не могу врубиться. Можно объяснить каждую букву? Самое главное не понимаю, зачем здесь кастить?
Что это значит?
@@DolphinArtem Animal - це тип, otherAnimal - ім'я конкретного екземпляра цього типу (називаємо як хочемо). Ну нам треба конкретно тип Animal, тому понижаємось для того, щоб працювати конкретно з цим типом, бо може нам треба виконати якийсь метод , який є в класі
@@igorvasylevskyi3629 это я понял, мы понижаемся для того,что бы сравнить животное с животным, я не понял почему нам надо даункастить, ведь Animal это наследник Object.
А если у объекта несколько параметров в конструкторе ? Как сравнить ?
Все понятно, но вы так и не сказали, почему у класса String метод equals уже переопределен заранее? Если в классе Animals нам приходилось переопределять метод equals вручную, то почему в классе String это уже сделано за нас, и самое главное как?
Да, в String метод equals() переопределен, он сравнивает строки посимвольно. Вот реализация:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
Здравствуйте. Какую раскладку клавиатуры в IntelliJ IDEA используете (Mac Os x 10.5+?)
12:48 объект класса Hello?
Когда пишется String str1 = new String("Hello");
String str2 = new String("Hello");
На самом деле создается 3 строки, а не 2. Ещё одна попадает в String pool
Какая и как вы это проверяете?
Кто-нибудь, поясите, пожалуйста, зачем на 7:16 нужен downcasting? Почему без него не работает просто obj.id ?
Потому что у объектов класса Object нет поля id. А у объектов класса Animal он есть.
При переопределении equals(), в теле метода сравнивать ссылочные типы данных через equals(), класа Object, или == ?
ссылочные типы в теле equals надо сравнивать с помощью их определенных equals().
спс)
Не переопределяет pubjic boojean eguajs(Object obi)
здравствуйте, подскажите пожалуйста в какую цену практика
Привет, а будет урок о создании и работе с пользовательским интерфейсом?
меня больше интересует автоматическая генерация и обработка (работа с формой через графический режим), чем вручную.
Привет, пока нет.
Почему все таки при сравнении String s = "S"; String s2 = "S", sout(s==s2) --> выдает true, ведь ссылки на объекты разные
Подскажите плс
не совсем так. Вот если бы ты создал объекты строк, через форму String s = new String("S"); и подобным s2, то получил бы false, т.к. данные объекты хранились бы в разных ссылках
ИМХО
бля хахахахаха))) скриньте, кто заметил)) я прокачался и сам себе ответил на вопрос, который уже забыл, спустя 4 месяца =D
метод equals в классе String уже переопределен заранее для сравнения посимвольно
🧠
Все как всегда супер. Ноесть вопрос. 5мин43с: equals - это ссравнение по ссылкам, 16мин42с: equals - сравнивает структрно... Где правда?
На 5:43 метод equals() не был переопределен и сравнивал объекты по ссылкам. На 16:42 метод equals() уже был переопределен и сравнивал объекты структурно (по их id).
По умолчанию, метод equals() работает так же, как и ==.
Поэтому обычно этот метод переопределяют, чтобы он сравнивал объекты структурно.
@@alishevN и какой смысл его переопределять, если можно свой написать, в чем выгода ?
@@Прощепростого-д6р Можно написать свой, все будет работать. Переопределение скорее служит как признак хорошего стиля, все знают стандартный метод equals и его предназначение. И переопределяя его ты показываешь, что требуешь того же результата, но своей реализацией. А создавая новый метод ты можешь использовать его для другой цели. По крайней мере, такие мысли могут возникнуть у других людей. Так что переопределение - признак хорошего тона и удобочитаемости кода.
@@densteaz ясно )).
@@densteaz не только удобочитаемость. Если метод переопределить, то при вызове метода ВСЕГДА будет вызываться метод из класса Animal (в том числе, если equal). Если создать свой метод equals (Animal animal) то он будет вызываться только из объекта Animal, а из объектов более нижнего уровня будет вызываться метод equals(Object obj)
Downcasting не безопасен же?
почему?
Но ведь мы точно знаем, что Animal это Object, так?
@@DolphinArtem выучил джаву?))
Почему то без предопределение метода equals , у меня все итак заработало. Кажется этот идет дефольтна
У меня на java8 не принимает конструкцию Animal otherAnimal=(Animal) obj,пишет cannot cast 'java.util.Objects' to 'Animal'
и что делать?
Простите,разобрался сам.Нужно было через @Override.
Как именно выглядит код с @Override
Pochemu ne potchodit tak?
public boolean equals(Animal animal) {
return (this.id == animal.id);
}
Ты должен ПОЛНОСТЬЮ повторить сигнатуру метода, которого переопределяешь. В данном случае это public boolean equals(Object obj).
equals(Object obj) - это сигнатура метода.
то указатель, то ссылка. разные вещи вообще-то, ну ладно)
Я вообще туда попал мне нужно написать такой код поисковик который сначало принимает приложение а после слово если данное слово есть в приложении try нет false как это воплотить?
Уважаемый автор, вас возможно плагиатят swiftbook.ru/content/java-1-video-33/
Я разрешил сайту SwiftBook размещать свои видео-уроки, поэтому все ок.
Все равно спасибо вам, что предупредили!
Тема не расскрыта.
поконкретнее?
В принципе можно было и return ((Car)obj).id == this.id; ограничиться
Спасибо!