Сравнение строк и интернирование - PullRequest
0 голосов
/ 25 июня 2018

Следующий код (из интервью) дает вывод false, но я считаю, что это должно быть true.

public static void main(String[] args) {    
    String a = "hello";
    String b = a + "world";
    String c = "helloworld";
    System.out.println(b==c);
}

Я думал, что константные выражения String были интернированы, а a + "world" является константой, поэтому он должен интернировать "hello world".

Может кто-нибудь объяснить, почему вывод false?

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

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

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

stringInstance.equals(anotherStringInstance)

Если бы вы сделали что-то подобное

String a = "abcde";
String b = a;

Тогда вы бы получили == bЗначение true, поскольку обе переменные указывают на один и тот же объект.

0 голосов
/ 25 июня 2018

Java интернирует все строки, которые являются константами времени компиляции .Однако только строки, объявленные конкатенацией String литералы , считаются константой времени компиляции и поэтому должны быть интернированы.

Это происходит потому, что компилятор смотрит только на компилируемую строку, поэтому он понятия не имеетесли a если константа или нет.Например, a может быть объявлено как:

String a = new Date().toString();

Следовательно, c является экземпляром String, отличным от b.

0 голосов
/ 25 июня 2018

При назначении строк, как в вашем примере, a, b и c являются отдельными String объектами. Поэтому, сравнивая их, вы получаете false, потому что они не один и тот же объект . == в Java не выполняет посимвольное сравнение строки. Вот для чего String.equals().

Это краткое изложение, чтобы прочитать: Как сравнить строки в Java?

0 голосов
/ 25 июня 2018

Когда вы делаете это,

String b=a+"world";

Компилятор выбирает конкатенацию StringBuilder на основе *1004* объектов, например,

StringBuilder sb = new StringBuilder(a);
sb.append("world"); 
String b = sb.toString();

Это дает другую ссылку, следовательно, возвращает false, как в вашем случае.

Но если вы используете это,

String b="hello"+"world";

Затем компилятор определяет ее как константу, и обе переменные b и c ссылаются на один и тот же литерал в пуле констант. Следовательно, он возвращает true.

...