У цій статті, хотілося б розглянути, розібрати, розповісти і показати, у чому різниця між методом append з класу
Так, людина, яка безперечно не заглиблювалася в це питання, скаже: "Навіщо мені замінювати оператор + = створенням нового об'єкта взагалі іншого класу, після чого викликати ще й метод? Про яку оптимальність мова? Адже вибір очевидний, ти про що взагалі?
StringBuilder
і оператором +=
для String
. Тут питання стоятиме не так в областях застосування, як в оптимізації коду.
toString()
" і буде зовсім не правий. Одна із проблем полягає в тому, що String
не є примітивом. String
- об'єкт як і будь-який class
Java, а як відомо, Java немає такого поняття як перевантаження операторів (Як наприклад в С++), оператори визначені тільки для примітивів, для будь-якого ж класу ми з вами не може перевизначити ніякий оператор. Саме тому оператори " +
" та "+
=" є свого роду "мабоцями" бібліотеки Java, а мабоця завжди зазнає втрат. Власне, давайте перестанемо тягнути хвіст за кота і перейдемо до вимірів. Ось проста програма заміряє час "склеювання" рядка зі змінною циклу 100000 разів.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
String s = "Вітання";
for(int i = 0; i < 100000; ++i)
{
s+=i;
}
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
На моєму комп'ютері в консоль вивелося 6815ms. Тобто моєму комп'ютеру знадобилося майже 7 секунд, щоб склеїти цей рядок. Тепер давайте замінимо на StringBuilder і навіть включимо метод toString()
у виміри.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
StringBuilder sb = new StringBuilder("Вітання");
for(int i = 0; i < 100000; ++i)
{
sb.append(i);
}
String s = sb.toString();
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
Мій ПК сказав мені 10ms. Т. е. 0.01 Секунди. Думаю, різниця на практиці дуже очевидна, грубо кажучи у 700 разів append
відпрацював швидше. Викликано це тим, що найімовірніше " +
" і "+=
і самі можуть викликати цей же append, але при цьому пройшовши довгий шлях по мабоцях мови, щоб зрозуміти, що такий оператор взагалі є і що він повинен робити (останній абзац не більше ніж здогад, я не розробник JVM і не знаю що там і як) Це наочний приклад того, що зайвий об'єкт зовсім не завжди є витратним.Так, код стане на кілька рядків довшим, зате економія часу у великих проектах може стати колосальною.Прошу помітити, що виміри проводабося далеко не на офісному ПК з доісторичним процесором, а тепер уявіть, яка різниця буде на цьому самому офісному комп'ютері, який важко тягне косинку.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ