JavaRush /مدونة جافا /Random-AR /String += String أو StringBuilder.append(String)؟
SemperAnte
مستوى
Донецк

String += String أو StringBuilder.append(String)؟

نشرت في المجموعة
في هذه المقالة، أود أن أفكر في الفرق بين طريقة الإلحاق من الفصل StringBuilderوعامل التشغيل +=لـ String. هنا لن يكون السؤال في مجالات التطبيق بقدر ما يتعلق بتحسين الكود.
String += String أو StringBuilder.append(String)؟  - 1
نعم، سيقول الشخص الذي لم يتعمق في هذا السؤال بلا شك: "لماذا يجب علي استبدال عامل التشغيل += بإنشاء كائن جديد من فئة مختلفة تمامًا، ثم استدعاء الطريقة أيضًا toString()؟ ما نوع الأمثلية التي لدينا؟ "هل تتحدث؟ الاختيار واضح، ما الذي تتحدث عنه؟" وسيكون مخطئا تماما. إحدى المشاكل هي Stringأنها ليست بدائية. String- كائن مثل أي كائن آخر classفي Java، وكما تعلم، في Java لا يوجد شيء مثل التحميل الزائد للمشغل (كما هو الحال في C++، على سبيل المثال)، يتم تعريف العوامل فقط للأوليات، وبالنسبة لأي فئة لا يمكننا تجاوز أي عامل. هذا هو السبب في أن المشغلين " +" و " += " هما نوع من "العكاز" لمكتبة Java، والعكاز دائمًا ما يتكبد الخسائر. في الواقع، دعونا نتوقف عن سحب ذيل القطة وننتقل إلى القياسات. إليكم برنامجًا بسيطًا يقيس الوقت الذي يستغرقه "لصق" خط بمتغير حلقة 100000 مرة.
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");
    }
}
أخبرني جهاز الكمبيوتر الخاص بي بـ 10 مللي ثانية. أي 0.01 ثانية. أعتقد أن الفرق في الممارسة واضح تمامًا، فقد كان يعمل appendبشكل أسرع 700 مرة تقريبًا. ويرجع ذلك إلى حقيقة أنه على الأرجح يمكن لـ " +" و " +=" أن يطلقوا على أنفسهم نفس الملحق ، ولكن في نفس الوقت قطعوا شوطًا طويلاً عبر عكازات اللغة من أجل فهم أن مثل هذا العامل موجود على الإطلاق وما هو يجب أن تفعل ذلك (الفقرة الأخيرة ليست أكثر من مجرد تخمين، فأنا لست مطور JVM ولا أعرف ما هو موجود وكيف). وهذا مثال واضح على حقيقة أن الكائن الإضافي ليس مكلفًا دائمًا. نعم، سيصبح الكود أطول بمقدار سطرين، لكن توفير الوقت في المشاريع الكبيرة يمكن أن يكون هائلاً. يرجى ملاحظة أن القياسات لم يتم إجراؤها على جهاز كمبيوتر مكتبي مزود بمعالج ما قبل التاريخ، ولكن الآن تخيل الفرق الذي سيحدثه ذلك على جهاز الكمبيوتر المكتبي هذا، والذي بالكاد يمكنه سحب الوشاح.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION