JavaRush /Блоги Java /Random-TG /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- an objectе мисли ҳама гуна дигар classдар Java ва тавре ки шумо медонед, дар Java чизе ба монанди изофабории оператор вуҷуд надорад (масалан, дар C++), операторҳо танҳо барои ибтидоӣ муайян карда мешаванд ва барои ҳама синфҳо мо наметавонем ягон операторро бекор кунем. Ин аст, ки операторҳои " +" ва " += " як навъ "асоба"-и китобхонаи 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");
    }
}
Дар компютери ман, 6815ms дар консол нишон дода шуд. Яъне, барои пайваст кардани ин хат компютери ман қариб 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");
    }
}
Компютери ман ба ман 10ms гуфт. Яъне 0,01 сония. Ман фикр мекунам, ки фарқият дар амалия хеле равшан аст; тақрибан 700 маротиба appendтезтар кор кард. Ин аз он сабаб аст, ки ба эҳтимоли зиёд " +" ва " +=" худ метавонанд як замима номида шаванд, аммо дар айни замон роҳи тӯлониро аз асобагони забон тай намуда, барои фаҳмидани он ки чунин оператор ҳатто вуҷуд дорад ва он чӣ бояд кард (параграфи охирин чизе беш аз як тахмин нест, ман таҳиягари JVM нестам ва намедонам, ки дар он ҷо чӣ ва чӣ гуна аст). Ин мисоли равшани он аст, ки an objectи зиёдатй на хамеша кимат аст. Бале, рамз як чанд сатр дарозтар мешавад, аммо сарфаи вақт дар лоиҳаҳои калон метавонад бузург бошад. Лутфан қайд кунед, ки андозагирӣ дар компютери офисӣ бо протсессори пеш аз таърихӣ анҷом дода нашудааст, аммо ҳоло тасаввур кунед, ки он дар ин компютери офисӣ, ки рӯймолро базӯр кашида наметавонад, чӣ фарқияте хоҳад дошт.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION