почему мы не можем использовать <, ,>= реляционные операторы в строке?

#java

#java

Вопрос:

Я хочу знать, почему мы не можем использовать реляционные операторы < , <= > или >= в строках.

 import java.util.*;
public class Coffee{
    public static void main(String args[]){
        String s1="Cat";
        String s2="Dog";
        System.out.println(s1 < s2);
    }
}
  

выдает ошибку «оператор < не может быть применен к java.lang.Строка».

Почему Java не может сравнивать строки следующим образом: C < D ?

Комментарии:

1. Потому что какой смысл «Гробовщик» > «Рэй Мистерио» для человека, который никогда не смотрел WWE?. Java неявно принимает значения int символов и сравнивает.. (в отличие от C , где операторы перегружены.)

2. Просто — потому что Java решила не реализовывать эти операторы для приема строковых аргументов. Вы делаете это с помощью реализаций компаратора.

3. Поведение > etc. Должно соответствовать compareTo , так что это не проблема.

Ответ №1:

Простой ответ: потому что они не были реализованы. Java (в отличие, например, от C / C ) не зависит от перегрузки операторов, поэтому вам нужно получить значение строки с помощью length метода, а затем сравнить результаты с вашими < > <= >= операторами.

Примечание: Строки в Java также реализуют сопоставимый интерфейс. Это позволяет вам использовать метод compareTo, который возвращает 0, если аргумент равен строке, значение меньше 0, если аргумент больше строки, на которой вы запускаете этот метод; и значение больше 0, если аргумент является строкой, меньшей этой строки.

Примечание 2: Под «большей строкой» я подразумеваю лексикографически большую (в алфавитном порядке).

Комментарии:

1. compareTo в строках не просто возвращает 1, 0 или -1.

2. Поскольку строки реализуют compareTo, < и т.д. было бы четко определено IMO. Я предполагаю, что разработчики Java не хотели делать строки более «особенными», чем они уже есть.

Ответ №2:

Строка не является примитивным типом данных, как int и double. Строки — это объекты.

Для строк реляционный оператор == проверяет только, «указывают» ли объекты на одни и те же данные в куче.

Например,

 String s1="Cat";
String s2= new String("Cat");

if(s1==s2)
System.out.println("They are the same");
  

Оператор if НЕ будет выполнен.
Это потому, что после того, как вы создали экземпляр «Cat», вы создаете другой экземпляр «Cat» в куче. Две переменные не «указывают» на одни и те же данные.

Методы compareTo проверяют, равны ли фактические данные, которым переменные распределены в куче, друг другу, и это один из многих правильных способов проверить, равны ли два строковых объекта друг другу.

Я надеюсь, что это помогло, если мой ответ неясен, пожалуйста, не стесняйтесь спрашивать.

Комментарии:

1. Это должно быть принятым ответом. Я совершенно забыл, что оператор equals (==) выполняет только проверку указателя; даже для Strring (ов).

Ответ №3:

Если вы действительно хотите это сделать, используйте compareTo результат.

 if ("a".compareTo("b") >= 0) {
    // do stuff
}
  

Если вы хотите игнорировать регистр, вы можете сделать:

 if (String.CASE_INSENSITIVE_ORDER.compare("A", "b") <= 0) {
   // do stuff
}
  

Ответ №4:

Вот правильный способ:

 import java.util.*;
public class Coffee {
    public static void main(String args[]) {
        String s1="Cat";
        String s2="Dog";
        System.out.println(s1.compareTo(s2));
    }
}