java равно и == путаница

Возможный дубликат:
что такое пул строк в java?

1. Я знаю, что == проверяет, указывают ли два объекта на одну и ту же ячейку памяти, также в определении по умолчанию равно используется == для проверки означает, что оба они одинаковы.

2. String класс переопределяет метод equals, чтобы проверить, имеют ли две строки одинаковое значение.

Рассмотрим S1 = "тест" и S2 = S1;

Теперь S1 и S2 - два разных объекта, поэтому для точки 1 S1 == S2 должно быть false, а для точки 2 - S1.equals (S2) должно быть true, но когда я запустил эту небольшую программу в eclipse, обе вернули true. Есть ли что-то особенное в строковых объектах, что S1 == S2 также верно.


person Sandeep Kumar    schedule 03.12.2012    source источник
comment
stackoverflow.com/questions/3801343/what- is-string-pool-in-java   -  person Daniel Pereira    schedule 03.12.2012
comment
И это, возможно, вопрос №1 по Java, который уже был задан на этом форуме. ;)   -  person Peter Lawrey    schedule 03.12.2012
comment
Теперь S1 и S2 - два разных объекта - нет, это не так. S2 и S1 являются ссылками на один и тот же строковый объект.   -  person perp    schedule 03.12.2012
comment
когда вы инициализируете S2 = S1, они оба указывают на одну и ту же ячейку памяти. попробуйте S1 = test; S2 = тест; это даст вам S1 == S2 false   -  person Mohd Mufiz    schedule 03.12.2012
comment
@PeterLawrey И каждый раз, когда его спрашивают, ему много раз отвечают. Что за трата времени... ;)   -  person brimborium    schedule 03.12.2012
comment
@Sandy, вы обнаружите аналогичное поведение с автоматически упакованными целыми числами и логическими типами.   -  person Peter Lawrey    schedule 03.12.2012


Ответы (4)


Рассмотрим S1 = "тест" и S2 = S1; Теперь S1 и S2 - два разных объекта.

Неа. Вот где ваш аргумент терпит неудачу.

Вы создали один строковый объект, и обе ваши переменные относятся к одному и тому же строковому объекту. Присваивание не создает новую копию строки.

person Mark Byers    schedule 03.12.2012

Когда ты пишешь

s1 = s2;

s1 и s2 являются ссылками на один и тот же объект, поэтому s1 == s2 всегда будет возвращать истину.

Сложнее - если вы напишете:

s1 = "test";
s2 = "test";
s3 = new String("test");

вы обнаружите, что s1 == s2 истинно, а s1 == s3 ложно. Это объясняется более подробно в этом сообщении.

person assylias    schedule 03.12.2012

Wiritng S1 = S2 приводит к тому, что они указывают на один и тот же объект

Письмо

String S1 = "test"
String S2 = "test"

Дает те же результаты, что и у вас сейчас. Это связано с оптимизацией компилятора, компилятор замечает неизменяемый строковый класс, поэтому он оптимизирует код, чтобы оба использовали один и тот же экземпляр. Вы можете заставить его создавать новые строки, создав их экземпляры с помощью конструктора.

String s1  = new String("test");
String s2  = new String("test");
System.out.println(s1 == s2) // false
System.out.println(s1.equals(s2)) //true
person G-Man    schedule 03.12.2012

когда вы инициализируете

S2=S1 

они оба указывают на одно и то же место в памяти.

пытаться

S1 = "test"; 
S2 = "test";

это даст вам

 S1==S2 //false
person Mohd Mufiz    schedule 03.12.2012