Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Сравнение строк на == в JDK


Автор: Zefick 13.4.2010, 06:18
  В классе JComponent в функции setUIProperty сравнение строк осуществляется с помощью оператора ==. Хотелось бы знать, почему так. Разве это работает?
  Я писал тест, который считывает строку из консоли и сравнивал её с тем, что должно быть. Когда сравнение equals давало положительный результат, то == давало ложь. Правда, если я создавал заранее переменную с заданным значением и сравнивал её с такой-же строкой, то == возвращал истину.

Автор: dobrolub 13.4.2010, 06:27
компилятор создаёт единственный объект для каждого стринга значение которого можно вычислить во время компиляции.

То-же самое достигаемо с помощью метода intern() для Стринга.

Пример:

Код

public class T {
  public static void main(String []args) {
    System.out.println(args[0] == args[1]); // false
    System.out.println(args[0].internt() == args[1].intern());// true
  }
}

ожидаемый результат:
Код

java Т yyy yyy
false
true

Автор: MaxPayneC 13.4.2010, 08:29
Цитата(dobrolub @  13.4.2010,  06:27 Найти цитируемый пост)
компилятор создаёт единственный объект для каждого стринга

За исключением случаев, когда мы создаем строку вызовом new String("some string"), тогда строковый буфер игнорируется.

Автор: dobrolub 13.4.2010, 09:33
А... Я думал в данном случае "some string" будет в пуле констант в классе, а в JVM в специально отведённом для скомпиллированного когда, и всего, что остаётся 'неизменным', участке памяти.(perm gen) , а созданный на его основе String - копия на heap.

Автор: MaxPayneC 13.4.2010, 09:58
Оператор new всегда создает новый объект, а создание строки путем String s = "asdf"; сначала поищет в пуле строк, и если найдет, вернет ссылку на существующий объект.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)