String.equals (StringBuilder) и StringBuilder.equals (String) Путаница - PullRequest
0 голосов
/ 13 марта 2019

Итак, мне дали этот фрагмент кода и задали вопрос: каков будет результат компиляции и выполнения класса Test.

package com.foo.bar; 

public class Test {
     public static void main(String[] args) {
         String str = "java";
         StringBuilder sb = new StringBuilder("java");

         System.out.println(str.equals(sb) + ":" + sb.equals(str));
     }
}

Результат по ним и программе при запуске через Eclipse:

false:false

Я не понимаю, почему это дает вышеуказанный вывод. Я думал, что класс String переопределяет .equals, так что он преобразует значения в строки и сравнивает их. т.е.:

Object b, Object c -> 
b.equals(c) ->
b.toString.equals(c.toString()) //b is a String

Это работает String.equals(). Если у вас есть str -> "java" и sb -> "java", которые оба переопределяют toString.

str.equals(sb) -> str.toString().equals(b.toString) -> true

1 Ответ

2 голосов
/ 13 марта 2019

Нет, String.equals не преобразует другой аргумент в String, а затем сравнивает символы.

Сравнивает эту строку с указанным объектом.Результат равен true тогда и только тогда, когда аргумент не null и является объектом String, представляющим ту же последовательность символов, что и этот объект.

Если другой объект не являетсяString, например StringBuilder, тогда он всегда будет возвращать false.Он будет не преобразовывать объект в String.

Как и любой правильно сформированный метод equals, он будет проверять, является ли данный объект того же класса (если он не null сначала), и если это так, приведите его к String, но он не будет вызывать toString или иным образом не преобразует данный объект в String.

...