В продовження попередньої статті про String http://jug-lviv.blogspot.com/2012/10/core-string-part-1.html друга стаття:
Магія String Об’экт/не об’єкт
public class StringObject {
public static void main(String[] args) {
String val ="object";
updateString(val);
System.out.println(val);
}
private static void updateString(String val) {
val ="not object";
System.out.println(val);
}
}
На консолі буде виведено:
not object
object
Отже: Не за бувайте, що String хоч і об’єкт але він є іммутабле і значення після передавання в функцію не буде змінюватись! Приклад pass-by-value.
Магія String Concatenation
Всі знають (ну майже всі), що для додавання стрінгів треба використовувати спеціальні класи, але на скільки це критично мало хто задумується…
public class StringPerformance {
public static void main(String[] args) {
long start = System.nanoTime();
badMethod("Test Message", "Watery Lane");
long duration = System.nanoTime() - start;
System.out.println("Using Strings took " + duration + "nS");
start = System.nanoTime();
StringBufferMethod("Test Message", "Watery Lane");
duration = System.nanoTime() - start;
System.out.println("Using StringBuffer took " + duration + "nS");
start = System.nanoTime();
StringBuilderMethod("Test Message", "Watery Lane");
duration = System.nanoTime() - start;
System.out.println("Using StringBuilder took " + duration + "nS");
}
private static String badMethod(String message, String location) {
String str = "Exception closing down ";
str += message;
str += " at ";
str += location;
str += " Press any key to exit";
return str;
}
private static String StringBufferMethod(String message, String location) {
StringBuffer str = new StringBuffer("Exception closing down ");
str.append(message);
str.append(" at ");
str.append(location);
str.append(" Press any key to exit");
return str.toString();
}
private static String StringBuilderMethod(String message, String location) {
StringBuilder str = new StringBuilder("Exception closing down ");
str.append(message);
str.append(" at ");
str.append(location);
str.append(" Press any key to exit");
return str.toString();
}
}
На моєму Intel i5 я отримав:
Using Strings took 73912nS
Using StringBuffer took 26563nS
Using StringBuilder took 10394nS
Продуктивність String vs StringBuilder вражаюча 700% на користь StringBuilder. Отже дуже раджу не лінитисьі використовувати StringBuilder!
Стосовно StringBuilder vs StringBuffer, то на перший погляд тут також просто – StringBuffer Thread safe. StringBuffer обов’язково потрібно використовувати, коли ви маєте багатопотокову систему.
Але от коли у вас не багатопотокова система, то тут не все так однозначно. В Java є така магічна річ як JIT, яка може видалити сихронізацію потоків і вирівняти продуктивнсть. Тож не потрібно обов’язково заміняти в легасі коді StringBuilder на StringBuilde, можливо, синхронізація і так видаляється.
Магія String Utils.
Клас String має достатньо багато інструментів, які нам допомагають зробити дуже багато речей найоптимальнішим шляхом, також Java має цілий набір класів які допомагають в маніпулюванні стрінгами. Але я б радив вам звернути увагу на сет спеціалізованих бібліотек, які ще більше полегшать життя кожному:
-Apache Commons – тут можна знайти цілу купу надзвичайно корисних дрібничок
-Google Guava – просто фантастична кількість утилітних класів
-Spring Utils – ще один додаток, який робить світ Spring самодостаттнім.
ПС: Як написано нижче – ми намагаємось освіжити JUG і зробити його актуальнішим, але без ваших відгукув – це неможливо!!! Чекаємо на ваші думки, побажання, пропозиції ось тут: http://jug-lviv.blogspot.com/2012/10/jug-reset.html