Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
String second = new String(habr); // аналогично second = habr;
-XX:BiasedLockingStartupDelay=0:StringBuffer: 5590ms.
StringBuilder: 5493ms.
Также изменения коснулись hashCode (новый алгоритм hashing)Оппа! Как такое может быть, если алгоритм хеширования для
String строго прописан в спецификации? test(new StringBuffer("")); // StringBuffer: 5020ms.
test(new StringBuilder("")); // StringBuilder: 14041ms.
test(new StringBuilder("")); // StringBuilder: 10716ms.
char[]-массив повесить тыщу строк, снижая оверхед на заголовки каждого массива. К примеру, вы загружаете из базы readonly-словарь, который всё равно будете держать всегда целиком в памяти. Можно было конкатенировать все строки и разбить по substring.The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method. String conversions are implemented through the method toString, defined by Object and inherited by all classes in Java.(ссылка на v8)
An implementation may choose to perform conversion and concatenation in one step to avoid creating and then discarding an intermediate String object. To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.(ссылка)
For primitive types, an implementation may also optimize away the creation of a wrapper object by converting directly from a primitive type to a string.
Как сказано в документации к Oracle JDK 6, 7 и 8
String habr = new StringBuilder(String.valueOf("habra")).append("habr").toString();
public String s(String v, String f){
return v + f;
}
public java.lang.String s(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
18: areturn
LineNumberTable:
line 3: 0
public String s(String v, String f){
return new StringBuilder().append(v).append(f).toString();
}
public String q(){
return "ha" + "br";
}Constant pool:
#2 = String #20 // habr
public java.lang.String q();
descriptor: ()Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: ldc #2 // String habr
2: areturn
LineNumberTable:
line 3: 0
String habrahabr = new StringBuilder()).append(habra).append(habr).toString();
Используйте метод concat, если слияние нужно провести только один раз, для остальных случаев рекомендовано использовать или оператор "+" или StringBuffer / StringBuilder.Никогда не используйте
concat. Обычный "+" или StringBuilder всегда будет эффективней, даже всего для двух строк. Просто потому, что JVM оптимизирует "+" специальным образом (это JVM intrinsic), а concat — нет (это обычный Java метод).new StringBuilder().append()...toString() (или то же самое со StringBuffer), и компилирует это как одно целое. Регулируется опцией -XX:+OptimizeStringConcat, по умолчанию включено."+" не специфицирована строго. Спецификация не требует, чтобы это обязательно был StringBuilder. Вон Алексей колбасит новую реализацию на invokedynamic. Если что-то получится, может работать ещё быстрее.String.concat может быть полезен, если ожидается много пустых строк на входе. Тогда он просто вернёт непустую строку, не создавая новых объектов вообще. Это будет быстрее, чем "+", даже с учётом интринсиков: спецификация обязывает "+" возвращать новый объект (если это не compile-time constant)."+" и "+=" названы «перегруженными». Можно ли считать, что оператор деления "/" «перегружен», потому что он ведёт себя по-разному для целых чисел и для дробных? По-моему, слово «перегружен» здесь неуместно вообще. Обычно его используют для пользовательской перегрузки в тех языках, где она поддерживается (в Java — нет). А так это просто «оператор конкатенации строк».Integer a = 1;
Integer b = 2;
Integer c = a + b;
Integer d = a - b; Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
Integer с = Integer.valueOf(a.intValue() + b.intValue());
Integer d = Integer.valueOf(a.intValue() - b.intValue());
StringJoiner в Java-8 адски медленный. В девятке разогнали.
Обработка строк в Java. Часть I: String, StringBuffer, StringBuilder