Сравнение строк JLabel и JTextField

Когда я использую сравнение строк JLabel с ==, работает нормально

private JLabel someJLabel = new JLabel("some text");
...
System.out.println (someJLabel.getText() == "some text"); // returns true

но когда я использую JTextField

private JTextField someJTextField = new JTextField("some text");
...
System.out.println (someJTextField.getText() == "some text"); // returns false

Я знаю, что если бы я использовал someJTextField.getText().equals("some text");, все бы работало нормально.

Так почему же это работает с JLabel, но не с JTextField?

РЕДАКТИРОВАТЬ: да, я знаю, что должен использовать .equals со строкой, я прочитал эту статью http://javatechniques.com/blog/string-equality-and-interning/, но уже известно, что я буду использовать «какой-то текст», чтобы он мог ссылаться на тот же строковый объект


person Community    schedule 07.12.2011    source источник


Ответы (4)


JTextField внутренне копирует строку в свой редактируемый объект документа для поддержки редактирования, поэтому вы не получите ту же строку в getText().

person Ashwinee K Jha    schedule 07.12.2011
comment
Я имею в виду, что в JLabel setText(t) выглядит так.text = t; в то время как в JTextField это похоже на this.getDocument().insertText(t); Так что т не сохраняется. Если вы посмотрите на реализацию метода setText() в этих классах в исходном коде jdk, это станет более очевидным. - person Ashwinee K Jha; 07.12.2011

Это не связано с JTextField и JLabel.

JVM использует пул строк внутри, и иногда оператор == работает, потому что разные строки (в вашем случае «какой-то текст») указывают на одну и ту же строку в пуле. Посмотрите на вопрос здесь

Никогда не сравнивайте строки с == !!!

person korifey    schedule 07.12.2011
comment
Я предполагаю, что метка имеет простую строку как модель (данные) внутри, но JTextField имеет Document. Поэтому, когда вы создаете JTextField (какой-то текст), он преобразует некоторый текст во внутреннее представление документа (может быть массив символов или что-то в этом роде), а когда вы вызываете someJTextField.getText(), он вызывает новый конструктор String (char []) - поэтому строка идентификатор отличается от оригинала (указывает на другое место в куче) - person korifey; 07.12.2011

Сравните строки с .equals(Object obj)

== в основном следует использовать только с примитивными объектами.

person Matt    schedule 07.12.2011

Есть небольшая разница между оператором == и методом .equals. Оператор == сравнивает два объекта, а метод .equals сравнивает значения в двух объектах.

В вашем случае вы сравниваете два разных объекта, хотя оба могут иметь одинаковые значения. В вашем случае вы можете использовать метод .equals. Это определенно поможет!

person Gandalf the white    schedule 18.03.2015