powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Спавнение String значений. ".equals" или "==" ?
30 сообщений из 30, показаны все 2 страниц
Спавнение String значений. ".equals" или "==" ?
    #32912029
Борщов А.С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какая разница между сравнением String значений используя ".equals" b "=="?
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912046
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
String s1 =  new  String("test");
String s2 = s1;
String s3 =  new  String("test");

System.out.println(s1.equals(s2)); // 1
System.out.println(s1.equals(s3)); // 2
    
System.out.println(s1 == s2); // 3
System.out.println(s1 == s3); // 4

1 и 2 - сравниваются значения объектов (и будет true и true)
3 и 4 - сравниваются ссылки на объекты (будет true и false)

--
Lacrima Mosa Est
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912047
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
String s1="a";
String s2="a";

s1 == s2 -> false
s1.equals(s2) -> true

В первом случае сравниваются ссылки на объекты s1 и s2, а во втором случае сравниваются значения, на которые указывают эти ссылки.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912051
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грасоff как всегда, в перед планеты всей :)
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912071
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenГрасоff как всегда, в перед планеты всей :)стораюсь!
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912134
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ wessenГрасоff как всегда, в перед планеты всей :)стораюсь!

Вот торопыга! Я не успел ответ продумать - Грасов уже запостил. Ай молодца!
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912152
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton А.Грасоff™ wessenГрасоff как всегда, в перед планеты всей :)стораюсь!

Вот торопыга! Я не успел ответ продумать - Грасов уже запостил. Ай молодца!спосибо на хлеп ниномажыш
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912252
Борщов А.С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за быстрый ответ. А какая разница между такими сравнениями:
Код: plaintext
1.
2.
3.
s1.equals("test");
и
s1=="test"
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912260
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борщов А.ССпасибо за быстрый ответ. А какая разница между такими сравнениями:
Код: plaintext
1.
2.
3.
s1.equals("test");
и
s1=="test"


s1 == "test" - по сути в месте где "test" создается новый объект (соотв. и ссылка на него уже уникальна)
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912271
Борщов А.С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А.Грасоff™ Борщов А.ССпасибо за быстрый ответ. А какая разница между такими сравнениями:
Код: plaintext
1.
2.
3.
s1.equals("test");
и
s1=="test"


s1 == "test" - по сути в месте где "test" создается новый объект (соотв. и ссылка на него уже уникальна)

То есть сравнение s1=="test" не имеет смысла т.к. всегда будет false. Правильно?
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32912273
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борщов А.С А.Грасоff™ Борщов А.ССпасибо за быстрый ответ. А какая разница между такими сравнениями:
Код: plaintext
1.
2.
3.
s1.equals("test");
и
s1=="test"


s1 == "test" - по сути в месте где "test" создается новый объект (соотв. и ссылка на него уже уникальна)

То есть сравнение s1=="test" не имеет смысла т.к. всегда будет false. Правильно?да
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32913196
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ Борщов А.С А.Грасоff™ Борщов А.ССпасибо за быстрый ответ. А какая разница между такими сравнениями:
Код: plaintext
1.
2.
3.
s1.equals("test");
и
s1=="test"


s1 == "test" - по сути в месте где "test" создается новый объект (соотв. и ссылка на него уже уникальна)

То есть сравнение s1=="test" не имеет смысла т.к. всегда будет false. Правильно?да

Если s1 было получено путём присвоения s1= "test" или s1 = new String("test").intern(), то будет true.

Разница между S==s1, S.equals(s1) и S== s1.intern() - 200, 1200 и 12000 ms на 10000000 сравнений %)
Смысл использовать intern() появляется только, если нужно из кучи (>10) стринговых констант найти равную s1 (и точно известно, что s1 есть в этом множесте). Правда в таком случае использование hashmap будет более оправдно, т.к. там используется hashcode строки.

На практике
Код: plaintext
1.
 if  s.equals(S1) {
}  else   if  s.equals(S2) {} ... 
в полтора раза быстрее чем
Код: plaintext
1.
2.
s = s.intern();  
 if  (s==S1) {
}  else   if  (s==S2) {} ...
если S = S1 и в полтора раза медленнее, если S = S20.
При использовании
Код: plaintext
1.
  int  i = ((Integer)HashMap#get(s)).intValue(); 
 switch (i) { case   1 :  2 : ... : 20  }.
(20 констант), при любом S - получаем постоянное время.
Если S==S1, оно в два раза лучше, чем у первого варианта.
Если S==S20, то в два раза лучше чем у второго %)
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32913223
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доп.инфа :)

Если s - это клон констант (new String(S1)), то, при равномерном распределении s по возможным значениям, первые два варианта работают практически одинаково - 20 секунд. Третий - 10 секунд.

Если s - это сама константа (s = S1), то первые два варианта работают 17-18 секунд. Третий - 1,5(!) секунд.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32913270
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsДоп.инфа :)

Если s - это клон констант (new String(S1)), то, при равномерном распределении s по возможным значениям, первые два варианта работают практически одинаково - 20 секунд. Третий - 10 секунд.

Если s - это сама константа (s = S1), то первые два варианта работают 17-18 секунд. Третий - 1,5(!) секунд.

Делается 20,000,000 вызовов:

Если заменить константы управляющие действием на наследование, то получим 671мс.

Если использовать класс констант и == (т.е. вариации на тему final static Object S1 = new Object(); и ветвления if (s==S1){..) - то 571мс

Если использовать Enum и switch для ветвления - 471 мс.

Если использовать Enum и прямой вызов метода - 371 мс.

Получается, что паттрен стратегия реализованный через enum, будет экономить 15-ть наносекунд на один вызов метода foo() %)
Хотя возможно, это всё происки jit с inline'ами, т.к. код очень простой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
enum Strategy{
    S1{   
         public   int  foo(Object o){
             return   1 ;
        }
    }, 
    S2{   
         public   int  foo(Object o){
             return   2 ;
        }
    }, ...

     abstract   int  foo(Object o);

}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 abstract   class  Strategy {
     abstract   int  foo(Object o);
}

 class  S1  extends  Strategy {   
         public   int  foo(Object o){
             return   1 ;
        }
}
 class  S2  extends  Strategy {   
         public   int  foo(Object o){
             return   2 ;
        }
} ...

Короче говоря
1) String в качестве константы - плохое решение.
2) Конструкция if s1.equals(s2) else if ... не идеальна.
3) какое всё это имеет отношение к исходному посту - не знаю %)
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32913429
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ Борщов А.Сне имеет смысла т.к. всегда будет false. Правильно?да

Граспых, я тебя поправлю ;-) . В общем случае ты _неправ_.

Вот пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 public   class  Class1 {
    public   static   void  main(String[] args) {
      String str1 = "Hello World!!!";
      String str2 = "Hello World!!!";
      System.out.println("Is str1 == str2?");

       if  (str1 == str2) {
         System.out.println("Answer: true");
      }  else  {
         System.out.println("Answer: false");
      }
   }
}

Как думаешь, что он напишет? ;-)
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32913452
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытно. Похоже что компиллятор оптимизировал код и устранил лишнюю константу. Поэтому и ссылки указывают на один адрес.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
.....

public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
    0 :	ldc	# 2 ; //String Hello World!!!
    2 :	astore_1
    3 :	ldc	# 2 ; //String Hello World!!!
    5 :	astore_2
    6 :	getstatic	# 3 ; //Field java/lang/System.out:Ljava/io/PrintStream;
    9 :	ldc	# 4 ; //String Is str1 == str2?
    11 :	invokevirtual	# 5 ; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
    14 :	aload_1
    15 :	aload_2
    16 :	if_acmpne	 30 
    19 :	getstatic	# 3 ; //Field java/lang/System.out:Ljava/io/PrintStream;
    22 :	ldc	# 6 ; //String Answer: true
    24 :	invokevirtual	# 5 ; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
    27 :	goto	 38 
    30 :	getstatic	# 3 ; //Field java/lang/System.out:Ljava/io/PrintStream;
    33 :	ldc	# 7 ; //String Answer: false
    35 :	invokevirtual	# 5 ; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
    38 :	return
}

....

...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32913759
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stdio А.Грасоff™ Борщов А.Сне имеет смысла т.к. всегда будет false. Правильно?да

Граспых, я тебя поправлю ;-) . В общем случае ты _неправ_.

Вот пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 public   class  Class1 {
    public   static   void  main(String[] args) {
      String str1 = "Hello World!!!";
      String str2 = "Hello World!!!";
      System.out.println("Is str1 == str2?");

       if  (str1 == str2) {
         System.out.println("Answer: true");
      }  else  {
         System.out.println("Answer: false");
      }
   }
}

Как думаешь, что он напишет? ;-)
идиоцкий код. ты фсегда так пишыш?
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32914758
mansch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавно , на собеседовании в одной конторе задавали такой вопрос
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32915854
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЛюбопытно. Похоже что компиллятор оптимизировал код и устранил лишнюю константу. Поэтому и ссылки указывают на один адрес.

Это не компилятор, а спецификация. "xx" и "xx" не две константы, а ссылки на одну константу из пула.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32915897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs maytonЛюбопытно. Похоже что компиллятор оптимизировал код и устранил лишнюю константу. Поэтому и ссылки указывают на один адрес.

Это не компилятор, а спецификация. "xx" и "xx" не две константы, а ссылки на одну константу из пула.

Опа! А я что не компиллятором пользовался? :)
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916017
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОпа! А я что не компиллятором пользовался? :)
Не знаю чем вы пользовались, но описанное выше поведение - спецификация языка, а не "умность или оптимизированность" компилятора.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916071
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs maytonОпа! А я что не компиллятором пользовался? :)
Не знаю чем вы пользовались, но описанное выше поведение - спецификация языка, а не "умность или оптимизированность" компилятора.

(хмуро) Я тебе чем-то неугодил? Почему в друх топиках чинишь расправу?

P.S. Ничего личного. Просто непонятки.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916144
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton NotGonnaGetUs maytonОпа! А я что не компиллятором пользовался? :)
Не знаю чем вы пользовались, но описанное выше поведение - спецификация языка, а не "умность или оптимизированность" компилятора.

(хмуро) Я тебе чем-то неугодил? Почему в друх топиках чинишь расправу?

P.S. Ничего личного. Просто непонятки.

Я? :) Не было такого.

На мой взгляд разница между "по спецификации" и "компилятор с оптимизировал" принципиальная. Плохо, если кто-нибудь прочитает и запомнить не правильную вещь.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916161
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
На мой взгляд разница между "по спецификации" и "компилятор с оптимизировал" принципиальная. Плохо, если кто-нибудь прочитает и запомнить не правильную вещь.

Ладно проехали. Извини если что не так.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916236
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
manschЗабавно , на собеседовании в одной конторе задавали такой вопросВопрос-то не совсем корректный... Знание языка как такового он особо не демонстрирует.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916265
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stdio manschЗабавно , на собеседовании в одной конторе задавали такой вопросВопрос-то не совсем корректный... Знание языка как такового он особо не демонстрирует.

А что демонстрирует знание языка?
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916475
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs stdio manschЗабавно , на собеседовании в одной конторе задавали такой вопросВопрос-то не совсем корректный... Знание языка как такового он особо не демонстрирует.

А что демонстрирует знание языка?ХЗ. М.б. умение эффективно дорписывать чужие исходники...
Но это вопрос который задан на собеседовании точно ни о чём не говорит, потому что знание этой особенности работы со строковыми литералами в Java как-то малопригодно для нормального человека: чего мы хотим добиться, сравнивая ссылки? Узнать что на один и тот же объект ссылаются ссылки? Ну хорошо, узнали. Что дальше? Всё равно объект класса String мы изменить не можем.
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32916906
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stdioХЗ. М.б. умение эффективно дорписывать чужие исходники...
Но это вопрос который задан на собеседовании точно ни о чём не говорит, потому что знание этой особенности работы со строковыми литералами в Java как-то малопригодно для нормального человека: чего мы хотим добиться, сравнивая ссылки? Узнать что на один и тот же объект ссылаются ссылки? Ну хорошо, узнали. Что дальше? Всё равно объект класса String мы изменить не можем.

"Что дальше" зависит от ситуации. Иногда имеет смысл сравнивать объекты по ссылкам, а не по equals :)

А что до самого вопроса, то он как раз говорит о том, насколько хорошо человек знает язык, на котором собирается писать.

Для того, что бы выяснить насколько хорошо человек умеет работать с чужим кодом - нужно задавать другие вопросы.

Что бы узнать насколько он силён в алгоритмах тертьи, в ООП четвётые,
какие технологии/библиотеки знает/умеет пользоваться - пятые.

Говорить не корректно - не корректно, всё зависит от того, на какую позицию претендует человек :)
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32917274
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsГоворить не корректно - не корректно, всё зависит от того, на какую позицию претендует человек :)Шутник.
Тогда уж лучше спрашивать вопросы типа: а зачем нужен класс String, если имеется StringBuffer

Как Вы думаете, почему
public static void main(String[] args) throws Exception {
float f = 2.34f;
double d = f;
System.out.println(d);
}
возвращает 2.3399999141693115?

А почему в C# нельзя вызвать статический метод через ссылку на объект, а Java - можно? Какой в этом смысл?
...
Рейтинг: 0 / 0
Спавнение String значений. ".equals" или "==" ?
    #32917920
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stdio NotGonnaGetUsГоворить не корректно - не корректно, всё зависит от того, на какую позицию претендует человек :)Шутник.
Тогда уж лучше спрашивать вопросы типа: а зачем нужен класс String, если имеется StringBuffer

Как Вы думаете, почему
public static void main(String[] args) throws Exception {
float f = 2.34f;
double d = f;
System.out.println(d);
}
возвращает 2.3399999141693115?

А почему в C# нельзя вызвать статический метод через ссылку на объект, а Java - можно? Какой в этом смысл?
:)
Можно и такие.
Только акцент, imho, должен быть сдвинут в другую сторону.
Например: В чём основная разница между String, StringBuffer, StringBuilder, когда какой из них лучше использовать.
А a = null; a.staticMethod(); - будет NPE или нет? И т.п.
Иначе вопросы превратся в филосовскую беседу о смысле жизни %)
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Спавнение String значений. ".equals" или "==" ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]