JavaRush /جاوا بلاگ /Random-UR /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");
    }
}
میرے کمپیوٹر نے مجھے 10ms بتایا۔ یعنی 0.01 سیکنڈز۔ میرے خیال میں عملی طور پر فرق بالکل واضح ہے؛ تقریباً بولیں تو اس نے 700 گنا appendزیادہ تیزی سے کام کیا۔ یہ اس حقیقت کی وجہ سے ہے کہ غالباً " +" اور " +=" خود ایک ہی ضمیمہ کہہ سکتے ہیں، لیکن اس کے ساتھ ہی زبان کی بیساکھیوں سے بہت طویل سفر طے کر کے یہ سمجھنے کے لیے کہ ایسا آپریٹر بھی موجود ہے اور کیا ہے۔ کرنا چاہیے (آخری پیراگراف ایک اندازے سے زیادہ کچھ نہیں ہے، میں JVM ڈویلپر نہیں ہوں اور مجھے نہیں معلوم کہ وہاں کیا ہے اور کیسے)۔ یہ اس حقیقت کی واضح مثال ہے کہ ایک اضافی چیز ہمیشہ مہنگی نہیں ہوتی۔ ہاں، کوڈ چند لائنوں کا ہو جائے گا، لیکن بڑے منصوبوں میں وقت کی بچت بہت زیادہ ہو سکتی ہے۔ براہ کرم نوٹ کریں کہ پیمائش پراگیتہاسک پروسیسر والے آفس پی سی پر نہیں کی گئی تھی، لیکن اب تصور کریں کہ اس دفتری کمپیوٹر پر کیا فرق پڑے گا، جو اسکارف کو مشکل سے کھینچ سکتا ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION