Почему compareTo() ведет себя так

Я пытаюсь сравнить две строки. Я использую метод compareTo, но вижу какое-то поведение, которое не понимаю.

System.out.println("5".compareTo("10") > 0);
System.out.println("13".compareTo("10") > 0);

Почему оба эти утверждения выводят true?

Почему вы ожидаете ложь?

Mad Physicist 09.07.2019 05:37

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

Stephen C 09.07.2019 05:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Естественный порядок строк Java — лексикографический, а не числовой. (См. javadoc, что означает лексикографическое значение в контексте строки Java.)

В первом примере символ '5' больше, чем символ '1', поэтому "5" больше, чем "10".

Во втором примере '1' является общим для обеих строк. Итак, переходим ко вторым символам и сравниваем '3' с '0'. Первый больше, поэтому "13" больше, чем "10".


А также:

Why is compareTo() behaving like this

Потому что спецификация говорит, что так и должно быть; см. ссылку выше. И потому что это имеет смысл.

(Вы бы не хотели, чтобы метод String::compareTo() пытался различать слова и числа и упорядочивать слова в алфавитном порядке, а числа - в числовом... и чесать свою метафорическую голову над строками, которые не являются ни тем, ни другим!)

Когда вы указываете значение в (""), оно обрабатывается как сравнение строк, и сравнение строк отличается от сравнения чисел.

попробуйте ниже, и вы будете знать.

    Integer targetValue = 10;
    Integer firstValue = 5;
    Integer secondValue = 13;

    System.out.println("5".compareTo("10") > 0);
    System.out.println("13".compareTo("10") > 0);

    System.out.println(firstValue.compareTo(targetValue) > 0);
    System.out.println(secondValue.compareTo(targetValue) > 0);

Другие вопросы по теме