سلاسل ثابتة - هذا يعني أنني يجب أن تستخدم أبدا += فقط StringBuffer?

StackOverflow https://stackoverflow.com/questions/1635659

سؤال

سلاسل ثابتة, معنى, مرة واحدة تم إنشاؤها يمكن تغييرها.

هل هذا يعني أن الأمر سيستغرق المزيد من الذاكرة إذا كنت إلحاق الأمور مع += مما إذا كان يمكنك إنشاء StringBuffer و إلحاق النص على ذلك ؟

إذا كنت تستخدم + = إنشاء جديد "كائن" في كل مرة يجب أن يتم حفظها في الذاكرة, أليس كذلك ؟

هل كانت مفيدة؟

المحلول

ونعم، سوف تقوم بإنشاء كائن جديد في كل مرة مع + =. هذا لا يعني انها دائما الشيء الخطأ القيام به، ولكن. ذلك يعتمد ما إذا كنت تريد أن قيمة كسلسلة، أو ما إذا كنت مجرد الذهاب لاستخدامها لبناء سلسلة تصل أبعد من ذلك.

إذا كنت في الواقع <م> تريد نتيجة x + y كسلسلة، فإنك قد كذلك مجرد استخدام سلسلة سلسلة. ومع ذلك، إذا كنت حقا ل(ويقول) جولة حلقة وإلحاق سلسلة أخرى، وأخرى، وما إلى ذلك - فقط تحتاج إلى النتيجة كسلسلة في النهاية، ثم StringBuffer / ب StringBuilder هي وسيلة للذهاب. في الواقع، حلقات حقا حيث يدفع ب StringBuilder من خلال سلسلة سلسلة - الفرق الأداء لمدة 5 أو حتى 10 تسلسالت المباشرة ستكون صغيرة جدا، ولكن لآلاف يصبح أسوأ بكثير - في الأساس لأن تحصل O (N <سوب> 2 ) تعقد مع سلسلة مقابل O () تعقد N مع ب StringBuilder.

في جاوة 5 فما فوق، يجب عليك استخدام أساسا ب StringBuilder - انها غير المتزامنة، ولكن هذا دائما تقريبا ما يرام. من النادر جدا أن ترغب في مشاركة واحدة بين المواضيع.

ولدي مقال rel="noreferrer"> التي قد تجدها مفيدة.

نصائح أخرى

القاعدة بسيطة:

إذا كنت تقوم بتشغيل تسلسالت في حلقة لا تستخدم +=

إذا كنت لا تشغيل تسلسالت في حلقة ، باستخدام += ببساطة لا يهم.(ما لم يكن أداء التطبيقات الحرجة

في جافا 5 أو في وقت لاحق، StringBuffer هو الخيط آمنة، وذلك لديها بعض النفقات العامة التي يجب أن لا تدفع للإلا إذا كنت في حاجة إليها. ب StringBuilder له نفس API ولكن لم يتم خيط آمنة (أي يجب استخدامها فقط داخلية لموضوع واحد).

نعم، إذا كنت بناء سلاسل كبيرة، وهو أكثر فعالية لاستخدام ب StringBuilder. وربما هو لا يستحق كل هذا العناء لتمرير ب StringBuilder أو StringBuffer حول كجزء من API الخاصة بك. هذا مربك للغاية.

وأنا أتفق مع كل الأجوبة نشرت أعلاه، ولكنها سوف تساعدك قليلا لفهم المزيد عن الطريقة التي يتم بها تنفيذ جافا. يستخدم JVM StringBuffers داخليا لتجميع سلسلة + المشغل (من في StringBuffer جافادوك ):

<اقتباس فقرة>   

وتستخدم مخازن سلسلة من   مترجم لتنفيذ ثنائي   سلسلة سلسلة المشغل +. إلى عن على   سبيل المثال، رمز:

     x = "a" + 4 + "c"
     

ويتم ترجمة إلى ما يعادل:

     x = new StringBuffer().append("a").append(4).append("c")
                           .toString()

وعلى نحو مماثل، x += "some new string" ما يعادل x = x + "some new string". هل ترى أين أنا ذاهب مع هذا؟

إذا كنت تفعل الكثير من تسلسالت سلسلة، وذلك باستخدام StringBuffer ورفع مستوى الأداء، ولكن إذا كنت تفعل سوى بضع تسلسالت سلسلة بسيطة، سوف مترجم جافا ربما الأمثل بالنسبة لك، وأنك لن تلاحظ اختلاف في الأداء

نعم. السلسلة غير قابل للتغيير. للاستخدام في بعض الأحيان، + = غير موافق. إذا كان + = العملية المكثفة، يجب أن تتحول إلى ب StringBuilder.

ولكن سوف جامع القمامة في نهاية المطاف تحرير السلاسل القديمة مرة واحدة لا توجد إشارات إليها

وبالضبط. يجب عليك استخدام ب StringBuilder ولو كان موضوع السلامة ليست قضية.

وكملاحظة جانبية: قد يكون هناك العديد من الأشياء سلسلة باستخدام نفس الدعم شار [] - على سبيل المثال كلما كنت تستخدم فرعية ()، لا شار الجديد [] سيتم إنشاء مما يجعل استخدامه كفاءة تماما.

وبالإضافة إلى ذلك، قد المجمعين تفعل بعض التحسين بالنسبة لك. على سبيل المثال إذا كنت تفعل

static final String FOO = "foo";
static final String BAR = "bar"; 

String getFoobar() {
  return FOO + BAR; // no string concatenation at runtime
}

وأنا لن يفاجأ إذا كان المترجم سوف تستخدم ب StringBuilder داخليا لتحسين سلسلة سلسلة حيثما أمكن ذلك - إن لم يكن بالفعل ربما في المستقبل

وأعتقد أنه يعتمد على GC لجمع الذاكرة مع سلسلة المهجورة. في القيام بذلك + = مع باني سلسلة سيكون بالتأكيد أسرع إذا كان لديك الكثير من العمل على سلسلة التلاعب. ولكن هذا لا ينبغي أن مشكلة بالنسبة لمعظم الحالات.

ونعم لو كنت وهذا هو بالضبط لماذا يجب عليك استخدام StringBuffer لسلسلة الكثير من سلاسل.

لاحظ أيضا أنه منذ 5 جافا يجب عليك أيضا تفضل ب StringBuilder أكثر من مرة. انها مجرد نوع من المتزامنة StringBuffer.

وأنت على حق أن سلاسل هي ثابتة، لذلك إذا كنت تحاول الحفاظ على الذاكرة أثناء القيام بالكثير من سلسلة سلسلة، يجب عليك استخدام ب StringBuilder بدلا من + =.

ومع ذلك، قد لا تمانع. يتم كتابة برامج للقراء الإنسان، لذلك يمكنك الذهاب مع وضوح. إذا كان من المهم أن على النحو الأمثل، يجب أن الشخصية أولا. ما لم يتم ترجيح البرنامج بشكل كبير جدا تجاه النشاط سلسلة، من المحتمل أن يكون هناك اختناقات الأخرى.

لا

وانها لن تستخدم المزيد من الذاكرة. نعم، يتم إنشاء كائنات جديدة، ولكن يتم إعادة تدويرها القديمة. في نهاية المطاف، فإن مقدار الذاكرة المستخدمة هي نفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top