Translate

понеділок, 15 жовтня 2012 р.

Core: String part 2


В продовження попередньої статті про String http://jug-lviv.blogspot.com/2012/10/core-string-part-1.html друга стаття:

Магія String Об'экт/не об'єкт

Хоч String і є об'єктом, але він є immutable і створююється новий об'єкт і референс на старий об'єкт перетираються.
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