JavaRush /Java blogi /Random-UZ /String += String yoki StringBuilder.append(String)?
SemperAnte
Daraja
Донецк

String += String yoki StringBuilder.append(String)?

Guruhda nashr etilgan
Ushbu maqolada men sinfdan qo'shish usuli StringBuilderva operatori o'rtasidagi farqni ko'rib chiqishni, tahlil qilishni, aytib berishni va ko'rsatmoqchiman . Bu erda savol dastur sohalarida emas, balki kodni optimallashtirishda bo'ladi. +=String
String += String yoki StringBuilder.append(String)?  - 1
Ha, shubhasiz, bu savolga chuqur kirib bormagan odam shunday deydi: "Nega men butunlay boshqa sinfning yangi ob'ektini yaratish orqali += operatorini almashtirishim kerak va keyin usulni ham chaqirishim kerak toString()? Biz qanday optimallikmiz? Tanlov aniq, nima haqida gapiryapsiz?” va u butunlay noto'g'ri bo'lar edi. Muammolardan biri shundaki, Stringu ibtidoiy emas. String- Java tilidagi har qanday boshqa ob'ektga o'xshash ob'ekt classva siz bilganingizdek, Java-da operatorni ortiqcha yuklash kabi narsa yo'q (masalan, C++ da bo'lgani kabi), operatorlar faqat primitivlar uchun aniqlanadi va har qanday sinf uchun biz hech qanday operatorni bekor qila olmaymiz. Shuning uchun " +" va " += " operatorlari Java kutubxonasining o'ziga xos "tayoqchasi" bo'lib, tayoq har doim yo'qotishlarga duchor bo'ladi. Aslida, keling, mushukning dumini tortib olishni to'xtatamiz va o'lchovlarga o'tamiz. Mana, pastadir o'zgaruvchisi bo'lgan chiziqni 100 000 marta "yopishtirish" uchun zarur bo'lgan vaqtni o'lchaydigan oddiy dastur.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hello";
        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");
    }
}
Mening kompyuterimda konsolda 6815 ms ko'rsatildi. Ya'ni, bu chiziqni birlashtirish uchun mening kompyuterim deyarli 7 soniya vaqt oldi. Endi uni StringBuilder bilan almashtiramiz va hatto usulni toString()o'lchovlarga kiritamiz.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hello");
        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");
    }
}
Kompyuterim menga 10ms dedi. Ya'ni 0,01 soniya. O'ylaymanki, amaliyotdagi farq juda aniq; taxminan aytganda, u 700 marta appendtezroq ishladi. Buning sababi shundaki, " +" va " +=" o'zlari bir xil qo'shimchani chaqirishlari mumkin, lekin shu bilan birga bunday operator mavjudligini va u nima ekanligini tushunish uchun tilning qo'ltiq tayoqlari orqali uzoq yo'l bosib o'tgan. qilish kerak (oxirgi xatboshi taxmin qilishdan boshqa narsa emas, men JVM ishlab chiqaruvchisi emasman va u erda nima va qandayligini bilmayman). Bu qo'shimcha ob'ekt har doim ham qimmatga tushmasligining yorqin misolidir. Ha, kod bir necha qatorga uzunroq bo'ladi, ammo yirik loyihalarda vaqtni tejash juda katta bo'lishi mumkin. E'tibor bering, o'lchovlar tarixdan oldingi protsessorli ofis kompyuterida amalga oshirilmagan, ammo endi bu ro'molni zo'rg'a tortib oladigan ofis kompyuterida qanday farq qilishini tasavvur qiling.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION