JavaRush /Java Blogu /Random-AZ /String += String və ya StringBuilder.append(String)?
SemperAnte
Səviyyə
Донецк

String += String və ya StringBuilder.append(String)?

Qrupda dərc edilmişdir
Bu yazıda, sinifdən əlavə metodu ilə StringBuilderoperator arasındakı fərqi nəzərdən keçirmək, təhlil etmək, danışmaq və göstərmək istərdim . Burada sual tətbiq sahələrində deyil, kodun optimallaşdırılmasında olacaq. +=String
String += String və ya StringBuilder.append(String)?  - 1
Bəli, şübhəsiz ki, bu sualın dərinliyinə getməyən bir adam deyəcək: “Niyə mən tamamilə fərqli sinifin yeni obyekti yaratmaqla += operatorunu əvəz etməliyəm və sonra metodu da çağırmalıyam toString()? danışırsan?Seçim göz qabağındadır, nə danışırsan?” və o, tamamilə yanılmış olardı. Problemlərdən biri də Stringonun primitiv olmamasıdır. String- Java-da hər hansı digər obyekt kimi bir obyekt classvə bildiyiniz kimi Java-da operatorun həddən artıq yüklənməsi kimi bir şey yoxdur (məsələn, C++-da olduğu kimi), operatorlar yalnız primitivlər üçün müəyyən edilir və istənilən sinif üçün biz heç bir operatoru ləğv edə bilmərik. +Məhz buna görə də " " və " = " operatorları +Java kitabxanasının bir növ "köpəkləri"dir və qoltuqağacı həmişə itkilərə məruz qalır. Əslində, pişiyin quyruğunu çəkməyi dayandıraq və ölçmələrə keçək. Budur, 100.000 dəfə döngə dəyişəni olan bir xətti “yapışdırmaq” üçün lazım olan vaxtı ölçən sadə proqram.
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");
    }
}
Mənim kompüterimdə konsolda 6815 ms göstərildi. Yəni bu xətti bir-birinə tikmək mənim kompüterimə az qala 7 saniyə çəkdi. İndi onu StringBuilder ilə əvəz edək və hətta metodu toString()ölçmələrə daxil edək.
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");
    }
}
Kompüterim mənə 10ms dedi. Yəni 0,01 Saniyədə. Düşünürəm ki, təcrübədəki fərq olduqca açıqdır; kobud desək, 700 dəfə appenddaha sürətli işləyirdi. Bunun səbəbi, çox güman ki, " +" və " +=" özləri eyni əlavə adlandıra bilər, lakin eyni zamanda belə bir operatorun ümumiyyətlə mövcud olduğunu və nəyin olduğunu başa düşmək üçün dilin qoltuqaltılarından uzun bir yol keçmişdir. etməli (sonuncu abzas təxmindən başqa bir şey deyil, mən JVM inkişaf etdiricisi deyiləm və orada nə olduğunu və necə olduğunu bilmirəm). Bu, əlavə bir obyektin həmişə baha başa gəlmədiyinin bariz nümunəsidir. Bəli, kod bir neçə sətir daha uzun olacaq, lakin böyük layihələrdə vaxta qənaət çox böyük ola bilər. Nəzərə alın ki, ölçmələr tarixdən əvvəlki prosessoru olan ofis kompüterində aparılmayıb, lakin indi təsəvvür edin ki, şərfi çətinliklə çəkə bilən bu ofis kompüterində nə qədər fərq olacaq.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION