JavaRush /Java блогу /Random-KY /String += String же StringBuilder.append(String)?
SemperAnte
Деңгээл
Донецк

String += String же StringBuilder.append(String)?

Группада жарыяланган
Бул макалада мен класстагы тиркеме ыкмасы StringBuilderменен оператордун +=ортосунда кандай айырма бар экенин карап, талдап, айтып жана көрсөткүм келет String. Бул жерде суроо колдонуу чөйрөсүндө эмес, codeду оптималдаштырууда болот.
String += String же StringBuilder.append(String)?  - 1
Ооба, бул суроонун тереңине кирбеген адам мындай дейт: “Эмне үчүн мен += операторун такыр башка класстын жаңы an objectин түзүү менен алмаштырып, анан методду да чакырышым керек? toString()Биз кандай оптималдуубуз? Тандоо ачык көрүнүп турат, эмнени айтып жатасың?» жана ал таптакыр туура эмес болмок. Көйгөйлөрдүн бири – Stringбул примитивдүү эмес. String- Java тorндеги башка an object сыяктуу an object classжана сиз билгендей, Javaда операторду ашыкча жүктөө деген нерсе жок (мисалы, C++ тorндегидей), операторлор примитивдер үчүн гана аныкталат жана кайсы бир класс үчүн биз эч кандай операторду жокко чыгара албайбыз. Ошондуктан " +" жана " += " операторлору Java китепканасынын кандайдыр бир "балдак" болуп саналат жана балдак ар дайым жоготууга учурайт. Негизи мышыктын куйругун тартууну токтотуп, өлчөөлөргө өтөлү. Бул жерде цикл өзгөрмөлүү сызыкты 100 000 жолу “жабыштырып” коюуга кеткен убакытты өлчөгөн жөнөкөй программа.
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");
    }
}
Менин компьютеримде консолдо 6815 мс көрсөтүлдү. Башкача айтканда, бул сызыкты бириктирүү үчүн менин компьютерим дээрлик 7 секунд талап кылынды. Эми аны StringBuilder менен алмаштырып, ал тургай методду toString()өлчөөлөргө киргизели.
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");
    }
}
Менин PC мага 10ms айтты. Башкача айтканда, 0,01 секунд. Менин оюмча, иш жүзүндө айырма айкын көрүнүп турат; болжол менен айтканда, ал 700 эсе appendтезирээк иштеген. +Бул, кыязы, " " жана " +=" бир эле тиркемени атай алат, бирок ошол эле учурда мындай оператордун дегеле бар экенин жана эмне экенин түшүнүү үчүн тилдин балдактары аркылуу бир топ жолду басып өтүү менен шартталган. ал кылышы керек (акыркы абзац болжолдоодон башка эч нерсе эмес, мен JVM иштеп чыгуучусу эмесмин жана ал жерде эмне жана кантип бар экенин билбейм). Бул ашыкча an object дайыма эле кымбат эмес экендигинин ачык мисалы. Ооба, code бир нече сапка созулат, бирок ири долбоорлордо убакытты үнөмдөө өтө чоң болушу мүмкүн. Көңүл буруңуз, өлчөөлөр тарыхка чейинки процессору бар кеңсе компьютеринде жасалган эмес, бирок азыр элестетип көрүңүз, ал жоолукту араң тарта турган дал ушул кеңсе компьютеринде кандай айырмачылыктарды жаратат.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION