JavaRush /جاوا بلاگ /Random-SD /String += String يا StringBuilder.append(String)؟
SemperAnte
سطح
Донецк

String += String يا StringBuilder.append(String)؟

گروپ ۾ شايع ٿيل
هن آرٽيڪل ۾، مان غور ڪرڻ، تجزيو ڪرڻ، ٻڌائڻ ۽ ڏيکارڻ چاهيان ٿو ته ڪلاس StringBuilder۽ آپريٽر +=لاءِ ضميمه واري طريقي جي وچ ۾ ڇا فرق آهي String. هتي سوال ايترو نه هوندو ايپليڪيشن جي علائقن ۾ جيترو ڪوڊ جي اصلاح ۾.
String += String يا StringBuilder.append(String)؟  - 1
ها، هڪ شخص جيڪو بلاشڪ هن سوال جي اونهائي ۾ نه ويو آهي، اهو چوندو: "ڇو مان هڪ مڪمل طور تي مختلف طبقي جي نئين شئي ٺاهي += آپريٽر کي تبديل ڪرڻ گهرجي، ۽ پوء اهو طريقو پڻ سڏيو وڃي toString()؟ اسان ڪهڙي قسم جي بهتري آهيون؟ جي باري ۾ ڳالهائيندي؟ چونڊ واضح آهي، توهان ڪهڙي بابت ڳالهائي رهيا آهيو؟ ۽ هو مڪمل طور تي غلط هوندو. مسئلن مان هڪ اهو آهي ته Stringاهو ابتدائي نه آهي. String- جاوا ۾ ڪنهن ٻئي وانگر هڪ اعتراض class، ۽ جيئن توهان ڄاڻو ٿا، جاوا ۾ آپريٽر اوور لوڊ ڪرڻ جي ڪا به شيء ناهي (جيئن ته C++ ۾، مثال طور)، آپريٽرز صرف پرائمري لاء بيان ڪيا ويا آهن، ۽ ڪنهن به طبقي لاء اسان ڪنهن به آپريٽر کي ختم نه ٿا ڪري سگهون. اهو ئي سبب آهي ته آپريٽر " +" ۽ " += " جاوا لائبريريءَ جو هڪ قسم جو "ڪرچ" آهن، ۽ ڪرچ هميشه نقصان پهچائيندو آهي. دراصل، اچو ته ٻلي جي دم کي ڇڪڻ بند ڪريون ۽ ماپ تي وڃو. ھتي ھڪڙو سادو پروگرام آھي جيڪو وقت کي ماپ ڪري ٿو جيڪو "گلو" ڪرڻ لاءِ وٺندو آھي ھڪڙي لڪير کي 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");
    }
}
منهنجي PC مون کي 10ms ٻڌايو. اهو آهي، 0.01 سيڪنڊ. منهنجو خيال آهي ته عمل ۾ فرق بلڪل واضح آهي؛ تقريبن ڳالهائڻ، اهو ڪم ڪيو 700 ڀيرا appendتيز. اهو ان حقيقت جي ڪري آهي ته گهڻو ڪري " +" ۽ " +=" پاڻ کي ساڳيو ضميمو سڏين ٿا، پر ساڳئي وقت زبان جي ڪچري مان هڪ ڊگهو رستو وٺي اهو سمجهڻ لاء ته اهڙي آپريٽر موجود آهي ۽ ڇا آهي. اهو ڪرڻ گهرجي (آخري پيراگراف هڪ اندازي کان وڌيڪ ڪجهه به ناهي، مان JVM ڊولپر نه آهيان ۽ مون کي خبر ناهي ته اتي ڇا آهي ۽ ڪيئن). هي حقيقت جو هڪ واضح مثال آهي ته هڪ اضافي اعتراض هميشه قيمتي ناهي. ها، ڪوڊ هڪ ٻه لائينون ڊگهو ٿي ويندو، پر وڏن منصوبن ۾ وقت جي بچت وڏي ٿي سگهي ٿي. مهرباني ڪري نوٽ ڪريو ته ماپون ڪنهن آفيس پي سي تي پراگاڻيڪ پروسيسر سان نه ڪيون ويون آهن، پر هاڻي تصور ڪريو ته هن آفيس جي ڪمپيوٽر تي ڇا فرق پوندو، جيڪو مشڪل سان سکارف کي ڇڪي سگهي ٿو.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION