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

Код: 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
11.02.2005, 15:51
    #32912047
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
String s1="a";
String s2="a";

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

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

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

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


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


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

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


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

То есть сравнение s1=="test" не имеет смысла т.к. всегда будет false. Правильно?да
...
Рейтинг: 0 / 0
13.02.2005, 10:50
    #32913196
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
А.Грасо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
13.02.2005, 11:51
    #32913223
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
Доп.инфа :)

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

Если s - это сама константа (s = S1), то первые два варианта работают 17-18 секунд. Третий - 1,5(!) секунд.
...
Рейтинг: 0 / 0
13.02.2005, 13:27
    #32913270
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
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
13.02.2005, 19:10
    #32913429
stdio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
А.Грасо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
13.02.2005, 19:50
    #32913452
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
Любопытно. Похоже что компиллятор оптимизировал код и устранил лишнюю константу. Поэтому и ссылки указывают на один адрес.

Код: 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
14.02.2005, 09:49
    #32913759
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
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
14.02.2005, 16:45
    #32914758
mansch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
Забавно , на собеседовании в одной конторе задавали такой вопрос
...
Рейтинг: 0 / 0
15.02.2005, 11:05
    #32915854
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
maytonЛюбопытно. Похоже что компиллятор оптимизировал код и устранил лишнюю константу. Поэтому и ссылки указывают на один адрес.

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

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

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

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

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

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

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

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

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

Ладно проехали. Извини если что не так.
...
Рейтинг: 0 / 0
15.02.2005, 13:00
    #32916236
stdio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спавнение String значений. ".equals" или "==" ?
manschЗабавно , на собеседовании в одной конторе задавали такой вопросВопрос-то не совсем корректный... Знание языка как такового он особо не демонстрирует.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Спавнение String значений. ".equals" или "==" ? / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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