JavaRush /Java Blog /Random-TK /Setir + = Setir ýa-da StringBuilder.append (setir)?
SemperAnte
Dereje
Донецк

Setir + = Setir ýa-da StringBuilder.append (setir)?

Toparda çap edildi
StringBuilderBu makalada goşundy usuly bilen synpdan operatoryň +=arasyndaky tapawudyň nämedigini göz öňünde tutmak, derňemek, aýtmak we görkezmek isleýärin String. Bu ýerde sorag kod optimizasiýasy ýaly amaly ugurlarda kän bolmaz.
String += String or StringBuilder.append(String)? - 1
Hawa, bu soraga çuňňur düşünmedik adam: “Näme üçin düýbünden başga bir synpyň täze obýektini döredip, + usulyny çalyşmaly, soňam usuly çagyrmaly toString()? Biz nähili optimizm? Saýlaw düşnükli, näme hakda gürleşýärsiň? " we düýbünden ýalňyş bolardy. Meseleleriň biri Stringbaşlangyç däl. String- Java-daky beýleki zatlar ýaly class, we bilşiňiz ýaly, Java-da operatoryň artykmaç ýüklenmegi ýaly zat ýok (mysal üçin C ++ bolşy ýaly), operatorlar diňe başlangyçlar üçin kesgitlenýär we islendik synp üçin haýsydyr bir operatory ýok edip bilmeris. +Şol sebäpli " " we " =" operatorlar +Java kitaphanasynyň bir görnüşi bolup, bir taýak elmydama ýitgi çekýär. Aslynda, geliň, pişigiň guýrugyny çekmegi bes edeliň we ölçeglere geçeliň. Ine, ýönekeý bir programma, 100,000 gezek aýlawly üýtgeýän çyzyk bilen “ýelimlemek” üçin wagt sarp edýär.
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");
    }
}
Kompýuterimde konsolda 6815 metr görkezildi. Thisagny, bu setiri birleşdirmek üçin kompýuterime 7 sekunt töweregi wagt gerekdi. Indi ony StringBuilder bilen çalyşalyň we hatda usuly toString()ölçeglere goşalyň.
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ýuterim maňa 10ms aýtdy. .Agny, 0.01 sekunt. Meniň pikirimçe, iş ýüzündäki tapawut gaty aç-açan; takmynan 700 esse appendçalt işledi. Munuň sebäbi, "" +"we" " +=" özleriniň bir goşundy diýip atlandyryp bilmekleri bilen baglanyşykly, ýöne şol bir wagtyň özünde şeýle operatoryň bardygyna we nämäniň bardygyna düşünmek üçin diliň gysgyçlaryndan uzak ýol geçdi. etmeli (soňky abzas çaklamadan başga zat däl, men JVM dörediji däl we ol ýerde näme we nädip bilemok). Bu goşmaça obýektiň hemişe gymmat düşmeýändiginiň aýdyň mysalydyr. Hawa, kod iki setir uzyn bolar, ýöne uly taslamalarda wagt tygşytlamak gaty uly bolup biler. Ölçegleriň taryhdan öňki prosessorly ofis kompýuterinde edilmändigini ýadyňyzdan çykarmaň, ýöne şarfy çekip bilmeýän bu ofis kompýuterinde nähili üýtgeşiklik döredjekdigini göz öňüne getiriň.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION