Java для начинающих. Урок 42: Метод equals() и String Pool.

Поделиться
HTML-код
  • Опубликовано: 10 фев 2025
  • МОЙ НОВЫЙ КУРС: • Мой курс "Продвинутая ...
    ПРАКТИКА НА JAVA: java-marathon....
    На этом уроке мы научимся сравнивать объекты в java.
    Реклама и сотрудничество: alishev.neil@gmail.com

Комментарии • 127

  • @alishevN
    @alishevN  7 лет назад +4

    Регистрируйтесь на курс "Продвинутая Java": ruclips.net/video/rRe1vT0SDD8/видео.html
    Практикуйтесь в написании Java кода: java-marathon.tilda.ws

    • @revolt4792
      @revolt4792 5 лет назад +1

      Здравствуйте очень хороший урок.
      Вопрос
      Я могу сравнить строки спомашю if-a нопрмер а место того что бы написать System.out.ptintln(string1.equals(string2))
      Написать if(string1.equals(string2))
      System.out.println("true")
      else System.out.println("folse")
      Я так попробовал но else не работает почему?
      Как надо писать код?

    • @MusaevElchin
      @MusaevElchin 5 лет назад +1

      @@revolt4792 да, так можно делать, потому что метод equls возвращает булевый тип т.е тру или фолс, что и требует условные оператор if, а почему не работает...надо смотреть код, может синтаксическая ошибка или еще что

  • @ИванФедькин-е6л
    @ИванФедькин-е6л 10 месяцев назад +2

    Алишев, у тебя талант. С тобой становятся понятно то, чего не знал раннее, будто между делом. Бывает, знаешь о чем говорят, но не понимаешь что пытаются донести.

  • @yuginlogan4169
    @yuginlogan4169 5 лет назад +33

    Вы просто молодец. материал подается структурировано, понятно. Рассказано что и зачем. Обязательно куплю Ваш курс.

  • @ОльгаНикифорова-з2в
    @ОльгаНикифорова-з2в 4 года назад +5

    Лучшие уроки по Java в русскоязычном youtube!

  • @AnastasiiaGaponova
    @AnastasiiaGaponova Год назад +2

    Замечательные уроки)
    Огромное спасибо за Ваш труд)

  • @raccoon8230
    @raccoon8230 4 года назад +33

    *Обалденно объясняете. Покупал курсы у Сергея Немчинского. Потратил $80 и честно говоря пожалел, потому что ваши уроки бесплатные и гораздо качественнее.*

    • @themostrusophobic
      @themostrusophobic Год назад +5

      @sibiryaq5085 а что плохого в русофобии? разве она не заслужена?

    • @Mis909
      @Mis909 Год назад

      @sibiryaq5085 А еще он Россиянин)

    • @МатвейДемченко-м6в
      @МатвейДемченко-м6в Год назад

      а к немцам как относитесь?@@themostrusophobic

    • @эпапа
      @эпапа Год назад

      @@themostrusophobic Русские утилизируют украинцев, это прекрасно

    • @cocogreat
      @cocogreat Год назад +3

      ​@@themostrusophobic ну если ты нацист то заслуженна , если ты адекватный человек то ты бы таких вопросов тупых не задавал

  • @Psiholirik
    @Psiholirik 4 года назад +14

    Шикарно, спасибо!
    Ваш курс "Продвинутая Java" очень помог.

  • @ВиталийТимонин-и6д
    @ВиталийТимонин-и6д 4 года назад +3

    Блин, первый раз услышал про String pool. Спасибо!

  • @svetlanamazhaykina6918
    @svetlanamazhaykina6918 7 месяцев назад

    Спасибо за Ваш труд! Коммент в поддержку канала.

  • @Devivl
    @Devivl 2 года назад

    Спасибо, Наиль. Очень интересно.

  • @TarikBat
    @TarikBat 2 года назад

    Алишев, хорошее объяснение!

  • @vornamenachname9524
    @vornamenachname9524 3 года назад +2

    просто круто пояснено!

  • @Юлия_23
    @Юлия_23 4 года назад +2

    Спасибо, очень детально!

  • @juliaokushko5251
    @juliaokushko5251 7 лет назад +4

    Спасибо за курс java! Все доступно и лаконично!

  • @bezsovesty6601
    @bezsovesty6601 5 лет назад +8

    Довольно понятно, но было бы неплохо так же рассказать про hashCode() и почему лучше его перегружать вместе с equals(). Ну а в equals я бы добавил:
    if (this == object)
    return true;
    if ( !(object instanceof Animal) )
    return false;

    • @alishevN
      @alishevN  5 лет назад +9

      Обо всем этом есть в моем курсе "Продвинутая Java" - www.udemy.com/javarussia/?couponCode=ADVANCED_JAVARUSSIA

  • @nikiforovsansanich
    @nikiforovsansanich 4 года назад +4

    Спасибо большое! Как всегда очень наглядное и доходчивое объяснение!

    • @dmitriy4204
      @dmitriy4204 3 года назад

      Так забавно, что еще год назад вы смотрели этот видеокурс и учились. А сейчас я смотрю ваш канал, паралельно с этим курсом.

    • @rozalytonoyan6490
      @rozalytonoyan6490 Год назад

      Никифоров и вам спасибо

  • @kladmonet9
    @kladmonet9 4 года назад +2

    Всё чётко и ясно!!!

  • @sgkng9697
    @sgkng9697 3 года назад +1

    Офигенное, крутое объединение знаний в удобный видос.
    Ещё бы добавить правда инфы про сравнение 2ух объектов, имеющие поля String, а не только int
    Потому что мне, например, непонятно обязательство проверки полей двух классов на != null

  • @ИванМордвин-в2э
    @ИванМордвин-в2э 4 года назад +4

    Спасибо! Интересный материал и подача хорошая!

  • @PM2d2
    @PM2d2 Месяц назад

    4:33 Самый сок будет, если добавить
    // animal1 --> {1} --> Gf@123 (ссылочный адрес на объект в памяти)
    // animal2 --> {1} --> Gf@735 и сразу видно и понятно почему false

  • @andre_tar
    @andre_tar 7 лет назад

    Все грамотно, доступно и ясно излагается! Спасибо!

  • @arthurfonzerelli6484
    @arthurfonzerelli6484 7 лет назад +2

    Эх, жалко так мало видео на канале, очень интересно было бы послушать про многопоточность в изложении автора.

    • @alishevN
      @alishevN  7 лет назад +6

      Уроки по многопоточности и по коллекциям уже готовы! Более 15 часов материала. В данный момент я проверяю все записанные уроки и исправляю мелкие неточности.
      Следите за обновлениями на канале!

  • @C2H5OHH
    @C2H5OHH 2 года назад +1

    Спасибо!

  • @CryptoVoltron7
    @CryptoVoltron7 2 года назад +1

    Гениально объяснили:-) Все сразу стало понятно.

  • @Алекс-ю8э2с
    @Алекс-ю8э2с 3 года назад

    Круто, спасибо!

  • @КириллКавалеров-е4з

    супер доходчиво:)

  • @Andrzej3935
    @Andrzej3935 3 года назад

    Вы красавчик.

  • @hikmatasgarli7036
    @hikmatasgarli7036 6 лет назад +1

    02.10.2018 Спасииибоооооо за уроки все ясно четко !!

  • @Steinovski
    @Steinovski 6 лет назад

    Отличный урок. единственно, что хотелось бы это ещё информациипо методу hashCode()Спасибо!

    • @alishevN
      @alishevN  6 лет назад +4

      Метод hashCode() и все, что с ним связано, очень подробно рассматривается в моем курсе "Продвинутая Java".

    • @Steinovski
      @Steinovski 6 лет назад

      @@alishevN спасибо за ответ!

  • @jamjam3337
    @jamjam3337 6 месяцев назад

    спасибо

  • @rendi5799
    @rendi5799 2 года назад

    Косячок 16:13. Правильно последний элемент включительно. И не "5", а "4". Подписка

  • @ИгорьЗубченко-у7щ
    @ИгорьЗубченко-у7щ 2 года назад +1

    А я сделал с методом intern() и у меня получилось .

  • @mashkovvan
    @mashkovvan 3 года назад

    Кстати в конструкции
    String val1 = new String ("Hello");
    String val2 = new String ("Hello");
    boolean val = val1.equals(val2)
    Val будет true. Наверное по этой причине ide и ругается. Чтобы вне зависимости от способа объявления объекта не было косяков, что то типо всегда юзайте equals и не мудрите))
    А так в целом от души, все как обычно сверх понятно 👋👌

    • @benjaminBTN
      @benjaminBTN 2 года назад

      А почему true? Ведь мы сравниваем два отдельных объекта. В начале этого видео в примере с Animal в подобном случае программа возвращала false, хотя структурно объекты были идентичны

    • @mashkovvan
      @mashkovvan 2 года назад +1

      Строки сравниваются по байтам, equals по умолчанию в String так работает.
      Сначала сравнение идёт по ссылкам, если ссылки равны, то возвращается true. Если нет то строки бьются на 2 массива байтов и сравниваются в обычном for

  • @serik3818
    @serik3818 3 года назад

    Классно

  • @ИванИванов-л1э6ы
    @ИванИванов-л1э6ы 3 года назад +1

    Спасибо за труд но почему то компилятор ругался пришлось изменить :
    public boolean equals(Object obj){
    Animal obj1 = (Animal) obj;
    return this.id==obj1.id;

  • @yegorivanov3006
    @yegorivanov3006 4 года назад +1

    За свой, пока короткий, период обучения смотрел некоторые интервью о программирование и языках программирования. Что ты знаешь о Котлин(вкратце)? Планируешь ли снимать о нём уроки?

  • @ГеоргийСтародубцев-й8у

    Вот более понятный пример сравнения несравнимого:
    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

    • @objectobj
      @objectobj 2 года назад

      При конкатенации строк неявно задействуется StringBuilder.

  • @DolphinArtem
    @DolphinArtem 3 года назад +4

    Объясните, пожалуйста, эту строчку:
    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, но получается нет и нужно спускаться. Начинается ступор )))

    • @Geovald
      @Geovald 4 месяца назад +4

      Возможно, уже поздно, но может этот ответ будет полезен кому-то другому. Для того, чтобы переопределить метод equals() в классе Object, нам нужно полностью повторить сигнатуру метода, а в сигнатуре метода в аргументы передается именно объект класса Object. То есть мы не можем переопределить метод, передав туда объект другого класса, даже если он наследуется от класса Object. Теперь же, когда мы переопределили метод, нам необходимо передать в него объект класса Object, Но проблема заключается в том, что в классе Object отсутствует поле id, по которому мы хотим провести сравнение. Для того, чтобы провести сравнение, нам нужно передавать объект класса Animal, но тогда, как уже говорил ранее, будет нарушена сигнатура метода и переопределения метода equals() в классе Object не случится. Поэтому мы делаем нисходящее преобразование (downcasting), как бы насильно опускаем объект класса Object до объекта класса Animal, для того, чтобы на этом объекте мы могли использовать поля класса Animal. Резюмируя, можно сказать, что downcasting здесь нужен для того, чтобы у объекта класса Object, который мы передаем в параметры при использовании метода equals(), был доступ к полям класса Animal. Надеюсь, я понятно изложил.

  • @ИльяИванов-л1ъ6н
    @ИльяИванов-л1ъ6н 6 лет назад +5

    Добрый день, спасибо большое за ваши уроки! Но может мне кто нибудь объяснить суть переопределения equal в этом уроке? Стоит ли когда либо вообще переопределять методы Objecta? В конкретном случае применять downcasting и т.д., когда можно просто создать семантически верный метод equalId (например), и принимать в качестве аргументов сразу Animal, а не Object?

    • @iyhan1987
      @iyhan1987 4 года назад +6

      Я конечно понимаю, что вопросу больше года уже, но вдруг его кто-то сейчас прочтет, а ответа все нет.
      Стоит это делать как минимум для работы с коллекциями. Например Set может содержать только уникальные объекты. Вы не можете в него положить два одинаковых animal. Но Set не знает, что, оказывается, сравнивать их надо каким-то самодельным методом.
      Аналогичная ситуация с List и его методом contains(). Если даже в листе animals лежит animal1, то без переопределения equals() вам метод animals.contains(animal1) вернет false

    • @ViktorKishankov
      @ViktorKishankov 4 года назад

      iyhan SPB спасибо за ответ! Но похоже что в данном виде это нарушает LSP, не так ли?

    • @manOfPlanetEarth
      @manOfPlanetEarth 4 года назад

      Viktor Kishankov
      lsp??

    • @iyhan1987
      @iyhan1987 4 года назад

      @@ViktorKishankov я не совсем понял вопрос. В каком "в данном" и как именно нарушает. Переопределение equals&hashCode - стандартная практика

    • @ViktorKishankov
      @ViktorKishankov 4 года назад +3

      @@iyhan1987 , ​ @man of planet Earth -- Принцип подстановки Лисков (Liskov substitution principle)
      «объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы». (Наследующий класс должен дополнять, а не изменять базовый.)
      В примере на видео класс Animal переопределяет equals которое использует своё поле id для валидации, но поле которого нет в родителском классе Object. Т.е. наследующий класс изменил базовый, сделав их не совместимы между собой. Например, если мы вызовем equals объекта Animal и аргументом будет класс Object (как и описано в сигнатуре), то возникнет ошибка. Прошу прощения если что-то упустил.

  • @05lda
    @05lda Год назад

    Когда я решаю изменить string1, создается новый объект в string pool?
    public static void main(String[] args) {
    String string1 = "Hello";
    String string2 = "Hello";
    string1 = "jfjf";
    System.out.println(string2);
    }

  • @ghostlynomad7788
    @ghostlynomad7788 3 года назад

    Почему в последнем примере возвращается false?
    Из-за того что сначала создается строка, но потом он изменяется с помощью substring и получается что после этого уже возвращается уже другой объект?

  • @andreywest9269
    @andreywest9269 7 лет назад +5

    Animal otherAnimal = (Animal) obj; // Данной строкой мы переопределяем тип данных из Object в Animal?

    • @igorvasylevskyi3629
      @igorvasylevskyi3629 5 лет назад +1

      Да

    • @DolphinArtem
      @DolphinArtem 3 года назад

      @@igorvasylevskyi3629 Не могу уложить в голове, что мы здесь делаем? Зачем понижаемся, что кладем в otherAnimal? Блин, хоть и смотрел апкастинг и даункастинг, тут просто не могу врубиться. Можно объяснить каждую букву? Самое главное не понимаю, зачем здесь кастить?

    • @DolphinArtem
      @DolphinArtem 3 года назад

      Что это значит?

    • @igorvasylevskyi3629
      @igorvasylevskyi3629 3 года назад +2

      @@DolphinArtem Animal - це тип, otherAnimal - ім'я конкретного екземпляра цього типу (називаємо як хочемо). Ну нам треба конкретно тип Animal, тому понижаємось для того, щоб працювати конкретно з цим типом, бо може нам треба виконати якийсь метод , який є в класі

    • @DolphinArtem
      @DolphinArtem 3 года назад

      @@igorvasylevskyi3629 это я понял, мы понижаемся для того,что бы сравнить животное с животным, я не понял почему нам надо даункастить, ведь Animal это наследник Object.

  • @ЕкатеринаБрюханова-в7и
    @ЕкатеринаБрюханова-в7и 6 месяцев назад

    А если у объекта несколько параметров в конструкторе ? Как сравнить ?

  • @B00RblY
    @B00RblY 5 лет назад +2

    Все понятно, но вы так и не сказали, почему у класса String метод equals уже переопределен заранее? Если в классе Animals нам приходилось переопределять метод equals вручную, то почему в классе String это уже сделано за нас, и самое главное как?

    • @EugenBatmanoff
      @EugenBatmanoff 4 года назад +1

      Да, в 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;
      }

  • @VitaliiYelinskyi
    @VitaliiYelinskyi 6 лет назад +1

    Здравствуйте. Какую раскладку клавиатуры в IntelliJ IDEA используете (Mac Os x 10.5+?)

  • @СергейТимофеев-п6н
    @СергейТимофеев-п6н 2 года назад

    12:48 объект класса Hello?

  • @ramz9564
    @ramz9564 2 года назад

    Когда пишется String str1 = new String("Hello");
    String str2 = new String("Hello");
    На самом деле создается 3 строки, а не 2. Ещё одна попадает в String pool

    • @objectobj
      @objectobj 2 года назад

      Какая и как вы это проверяете?

  • @ИгорьВоронов-ъ4м
    @ИгорьВоронов-ъ4м 2 года назад

    Кто-нибудь, поясите, пожалуйста, зачем на 7:16 нужен downcasting? Почему без него не работает просто obj.id ?

    • @objectobj
      @objectobj 2 года назад +1

      Потому что у объектов класса Object нет поля id. А у объектов класса Animal он есть.

  • @tarassagan4810
    @tarassagan4810 7 лет назад

    При переопределении equals(), в теле метода сравнивать ссылочные типы данных через equals(), класа Object, или == ?

    • @alishevN
      @alishevN  7 лет назад +3

      ссылочные типы в теле equals надо сравнивать с помощью их определенных equals().

    • @tarassagan4810
      @tarassagan4810 7 лет назад

      спс)

  • @ОлегТрофимчук-м9я
    @ОлегТрофимчук-м9я 9 месяцев назад

    Не переопределяет pubjic boojean eguajs(Object obi)

  • @Brokenssszzz
    @Brokenssszzz 3 года назад

    здравствуйте, подскажите пожалуйста в какую цену практика

  • @АндрійНіжинець
    @АндрійНіжинець 7 лет назад

    Привет, а будет урок о создании и работе с пользовательским интерфейсом?

    • @АндрійНіжинець
      @АндрійНіжинець 7 лет назад

      меня больше интересует автоматическая генерация и обработка (работа с формой через графический режим), чем вручную.

    • @alishevN
      @alishevN  7 лет назад

      Привет, пока нет.

  • @Ronobiliv
    @Ronobiliv 3 года назад

    Почему все таки при сравнении String s = "S"; String s2 = "S", sout(s==s2) --> выдает true, ведь ссылки на объекты разные
    Подскажите плс

    • @Ronobiliv
      @Ronobiliv 2 года назад

      не совсем так. Вот если бы ты создал объекты строк, через форму String s = new String("S"); и подобным s2, то получил бы false, т.к. данные объекты хранились бы в разных ссылках
      ИМХО

    • @Ronobiliv
      @Ronobiliv 2 года назад +5

      бля хахахахаха))) скриньте, кто заметил)) я прокачался и сам себе ответил на вопрос, который уже забыл, спустя 4 месяца =D

    • @Geovald
      @Geovald 2 года назад

      метод equals в классе String уже переопределен заранее для сравнения посимвольно

  • @Sooderone
    @Sooderone 7 месяцев назад

    🧠

  • @Женя-р8ц3й
    @Женя-р8ц3й 6 лет назад

    Все как всегда супер. Ноесть вопрос. 5мин43с: equals - это ссравнение по ссылкам, 16мин42с: equals - сравнивает структрно... Где правда?

    • @alishevN
      @alishevN  6 лет назад +3

      На 5:43 метод equals() не был переопределен и сравнивал объекты по ссылкам. На 16:42 метод equals() уже был переопределен и сравнивал объекты структурно (по их id).
      По умолчанию, метод equals() работает так же, как и ==.
      Поэтому обычно этот метод переопределяют, чтобы он сравнивал объекты структурно.

    • @Прощепростого-д6р
      @Прощепростого-д6р 6 лет назад +2

      @@alishevN и какой смысл его переопределять, если можно свой написать, в чем выгода ?

    • @densteaz
      @densteaz 6 лет назад +3

      @@Прощепростого-д6р Можно написать свой, все будет работать. Переопределение скорее служит как признак хорошего стиля, все знают стандартный метод equals и его предназначение. И переопределяя его ты показываешь, что требуешь того же результата, но своей реализацией. А создавая новый метод ты можешь использовать его для другой цели. По крайней мере, такие мысли могут возникнуть у других людей. Так что переопределение - признак хорошего тона и удобочитаемости кода.

    • @Прощепростого-д6р
      @Прощепростого-д6р 6 лет назад

      @@densteaz ясно )).

    • @alexfox5609
      @alexfox5609 5 лет назад +3

      @@densteaz не только удобочитаемость. Если метод переопределить, то при вызове метода ВСЕГДА будет вызываться метод из класса Animal (в том числе, если equal). Если создать свой метод equals (Animal animal) то он будет вызываться только из объекта Animal, а из объектов более нижнего уровня будет вызываться метод equals(Object obj)

  • @denned4192
    @denned4192 4 года назад +1

    Downcasting не безопасен же?

    • @yernartalgatuly4252
      @yernartalgatuly4252 4 года назад

      почему?

    • @DolphinArtem
      @DolphinArtem 3 года назад +1

      Но ведь мы точно знаем, что Animal это Object, так?

    • @Geovald
      @Geovald 2 года назад

      @@DolphinArtem выучил джаву?))

  • @aibardulatov
    @aibardulatov 4 года назад

    Почему то без предопределение метода equals , у меня все итак заработало. Кажется этот идет дефольтна

  • @СтаниславРябых-б2ш

    У меня на java8 не принимает конструкцию Animal otherAnimal=(Animal) obj,пишет cannot cast 'java.util.Objects' to 'Animal'
    и что делать?

  • @AndrulisTravel
    @AndrulisTravel 4 года назад

    Pochemu ne potchodit tak?
    public boolean equals(Animal animal) {
    return (this.id == animal.id);
    }

    • @OlegRonaldo9
      @OlegRonaldo9 4 года назад +3

      Ты должен ПОЛНОСТЬЮ повторить сигнатуру метода, которого переопределяешь. В данном случае это public boolean equals(Object obj).
      equals(Object obj) - это сигнатура метода.

  • @KocTu4eK
    @KocTu4eK 3 года назад

    то указатель, то ссылка. разные вещи вообще-то, ну ладно)

  • @Ethereum5500
    @Ethereum5500 2 года назад

    Я вообще туда попал мне нужно написать такой код поисковик который сначало принимает приложение а после слово если данное слово есть в приложении try нет false как это воплотить?

  • @mohawberel
    @mohawberel 6 лет назад

    Уважаемый автор, вас возможно плагиатят swiftbook.ru/content/java-1-video-33/

    • @alishevN
      @alishevN  6 лет назад +1

      Я разрешил сайту SwiftBook размещать свои видео-уроки, поэтому все ок.
      Все равно спасибо вам, что предупредили!

  • @ЭдуардЛукин-к3м
    @ЭдуардЛукин-к3м 2 года назад

    Тема не расскрыта.

    • @Geovald
      @Geovald 2 года назад

      поконкретнее?

  • @teorpract
    @teorpract Месяц назад

    В принципе можно было и return ((Car)obj).id == this.id; ограничиться

  • @Anatoli-bq1pe
    @Anatoli-bq1pe 2 года назад +1

    Спасибо!