JavaRush /Blog Java /Random-MS /String += String atau StringBuilder.append(String)?
SemperAnte
Tahap
Донецк

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

Diterbitkan dalam kumpulan
Dalam artikel ini, saya ingin mempertimbangkan, menganalisis, memberitahu dan menunjukkan apakah perbezaan antara kaedah tambah daripada kelas StringBuilderdan pengendali +=untuk String. Di sini persoalannya bukan dalam bidang aplikasi seperti dalam pengoptimuman kod.
String += String atau StringBuilder.append(String)?  - 1
Ya, seseorang yang sudah pasti tidak mendalami soalan ini akan berkata: "Mengapa saya harus menggantikan operator += dengan mencipta objek baharu kelas yang sama sekali berbeza, dan kemudian memanggil kaedah itu juga toString()? Apakah jenis optimum kita bercakap tentang? Pilihannya jelas, apa yang kamu cakapkan?" dan dia akan menjadi serba salah. Salah satu masalahnya ialah Stringia tidak primitif. String- objek seperti mana-mana yang lain classdalam Java, dan seperti yang anda tahu, di Java tidak ada perkara seperti operator overloading (Seperti dalam C++, sebagai contoh), operator ditakrifkan hanya untuk primitif, dan untuk mana-mana kelas kita tidak boleh mengatasi mana-mana operator. Itulah sebabnya operator " +" dan " +=" adalah sejenis "kruk" perpustakaan Java, dan kruk sentiasa mengalami kerugian. Sebenarnya, mari kita berhenti menarik ekor kucing dan beralih kepada ukuran. Berikut ialah program mudah yang mengukur masa yang diperlukan untuk "melekat" garisan dengan pembolehubah gelung sebanyak 100,000 kali.
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");
    }
}
Pada komputer saya, 6815ms dipaparkan dalam konsol. Iaitu, komputer saya mengambil masa hampir 7 saat untuk mencantumkan baris ini. Sekarang mari kita gantikannya dengan StringBuilder dan juga sertakan kaedah toString()dalam pengukuran.
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 saya memberitahu saya 10ms. Iaitu, 0.01 Saat. Saya fikir perbezaan dalam amalan agak jelas; secara kasarnya, ia berfungsi 700 kali appendlebih cepat. Ini disebabkan oleh fakta bahawa kemungkinan besar " +" dan " +=" sendiri boleh memanggil tambahan yang sama, tetapi pada masa yang sama telah pergi jauh melalui tongkat bahasa untuk memahami bahawa pengendali sedemikian wujud dan apa yang ia harus lakukan (perenggan terakhir tidak lebih daripada tekaan, saya bukan pembangun JVM dan saya tidak tahu apa yang ada dan bagaimana). Ini adalah contoh yang jelas tentang fakta bahawa objek tambahan tidak selalunya mahal. Ya, kod itu akan menjadi beberapa baris lebih panjang, tetapi penjimatan masa dalam projek besar boleh menjadi sangat besar. Sila ambil perhatian bahawa ukuran tidak dibuat pada PC pejabat dengan pemproses prasejarah, tetapi sekarang bayangkan betapa besarnya perbezaan yang akan dilakukan pada komputer pejabat ini, yang sukar untuk menarik selendang.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION