Класс String (valueof и проверка)

136
15 мая 2019, 18:40
public class Test {
    public static void main(String[] args) {
       String str = String.valueOf(65);
       if(str.equals(str)){
           System.out.println("Меня зовут Ваня");
       }
    }
}

Правильно ли я проверил значение которое было целочисленное, а стало строковое (65)? Если у нас сравнивается 1 (строка), значение, можно ли использовать вот такую конструкцию:

String str = String.valueOf(65);
       if(str.equals(str)){
           System.out.println("Меня зовут Ваня");
       }

И хотел еще спросить: equals() у нас сравнивает значение строк. А == сравнивает ссылки на объекты?

Answer 1

Выражение:

str.equals(str)

всегда будет возвращать true, если str не равно null, т.к. строка сравнивается сама с собой.

Если нужно проверить правильная ли получилась строка можете использовать такое условие:

if("65".equals(str)) {
....

equals() у нас сравнивает значение строк. А == сравнивает ссылки на объекты?

Да.

Answer 2

equals это в принципе метод, который обычно проводит массу проверок:

  • обычно сначала проверяется, что сравниваемые объекты не нулевые (потому что даже null.euals(null) == false)
  • что объекты принадлежат к одному классу
  • не являются ли сравниваемые объекты одним и тем же объектом, тот самый случай, когда может быть obj1 == obj2
  • затем уже сравнивается внутреннее значение полей.

В классе String метод equals после всех проверок на одинаковость классов сравнивает массивы байтов, полученные из строк:

@HotSpotIntrinsicCandidate
public static boolean equals(byte[] value, byte[] other) {
    if (value.length == other.length) {
        for (int i = 0; i < value.length; i++) {
            if (value[i] != other[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

Но это все верно для хорошо реализованных классов, таких как String, идущих с Java "из коробки". Для новых классов, если вы не переопределите этот метод, equals будет работать по умолчанию как в родительском классе (скорее всего классе Object):

public boolean equals(Object obj) {
    return (this == obj);
}

И в этом случае будет просто сравнивать ссылки. Имейте в виду такое коварство.

READ ALSO
Как установить Style в коде?

Как установить Style в коде?

Я создал новый style для кнопок:

140
Как создается массив, почему через new?

Как создается массив, почему через new?

Почему при создании массива используется new, так же как при создании обьекта:

128
Проблема с иконкой [закрыт]

Проблема с иконкой [закрыт]

Я уже битый час не могу понять, что с этим кодом не так! Иконка не устанавливается, Путь перепроверил всеми возможными и невозможными способамиЧто...

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

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

есть форма с отправкой данных на е-майлПри заполнение и отправке надо что бы пользователю открывался файл который находится по адресу /lessons/l1

149