java شرح لماذا StringBuilder عندما يكون هناك سلسلة؟




stringbuilder شرح (8)

لا تسمح String بإلحاق. تقوم كل طريقة تستدعيها في String بإنشاء كائن جديد وتقوم بإرجاعها. هذا لأن String غير قابلة للتغيير - لا يمكنها تغيير حالتها الداخلية.

على الجانب الآخر ، StringBuilder قابل للتغيير. عند استدعاء append(..) يقوم بتغيير صفيف char الداخلي بدلاً من إنشاء كائن سلسلة جديد.

وبالتالي يكون أكثر كفاءة أن يكون:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
    sb.append(i);
}

بدلاً من str += i ، مما يؤدي إلى إنشاء 500 سلسلة جديدة من الكائنات.

لاحظ أنه في المثال أستخدم حلقة. كما يلاحظ helios في التعليقات ، المترجم يترجم تلقائيا تعبيرات مثل String d = a + b + c إلى شيء من هذا القبيل

String d = new StringBuilder(a).append(b).append(c).toString();

لاحظ أيضًا أن هناك StringBuffer بالإضافة إلى StringBuilder . والفرق هو أن الأول لديه طرق متزامنة. إذا كنت تستخدمه كمتغير محلي ، فاستخدم StringBuilder . إذا حدث ذلك فمن الممكن أن يتم الوصول إليه بواسطة سلاسل عمليات متعددة ، فاستخدم StringBuffer (وهذا نادر)

لقد صادفت StringBuilder لأول مرة للمرة الأولى وفوجئت منذ أن قامت Java بالفعل بفئة String قوية للغاية تسمح بالإلحاق.

لماذا الفصل الثاني في الصف؟

أين يمكنني معرفة المزيد عن StringBuilder ؟


تكون فئة StringBuilder قابلة للتغيير وبخلاف String ، تسمح لك بتعديل محتويات السلسلة دون الحاجة إلى إنشاء المزيد من كائنات السلسلة ، والتي يمكن أن تكون مكسب أداء عندما تقوم بتعديل سلسلة بشكل كبير. يوجد أيضًا نظير لـ StringBuilder يُسمى StringBuffer وهو متزامن أيضًا لذا فهو مثالي للبيئات متعددة مؤشرات الترابط.

أكبر مشكلة في String هي أن أي عملية تقوم بها بها ، ستقوم دائمًا بإرجاع كائن جديد ، قل:

String s1 = "something";
String s2 = "else";
String s3 = s1 + s2; // this is creating a new object.

int wiek = (int)roznica.TotalDays;

 public double GetRandomNumber(double minimum, double maximum)
{ 
  Random random = new Random();
  return random.NextDouble() * (maximum - minimum) + minimum;
 }

  StringBuilder sb = new StringBuilder();
        sb.Append(producent + " " + kolor + " " + dataWaznosci.Date + " ");

        sb.Append(String.Format(" {0:0.00} zł", ObliczCene()));
        return sb.ToString();


         using System;
         using System.Collections.Generic;
         using System.Linq;
         using System.Text;
         using System.Threading.Tasks;

         namespace kolos_grD
            {
               internal class CenaMinimalnaException:Exception
           {
          public CenaMinimalnaException(string exc) : base(exc)
           {

              }
           }
            }

          using System.Runtime.Serialization.Formatters.Binary;
          using System.IO;

            public void Zapisz(string nazwa)
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream fs = new FileStream(nazwa + ".bin", FileMode.Create);
        bf.Serialize(fs, this);
        fs.Close();
    }
    public static Bank Odczytaj(string nazwa)
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream fs = new FileStream(nazwa + ".bin", FileMode.Open);
        Bank nowy = (Bank) bf.Deserialize(fs);
        Konto.current_numer_konta = nowy.lista_kont.Last().numer_konta;
        fs.Close();
        return nowy;
    }
    public void Sortuj()
    {
        List<Konto> pom = lista_kont.ToList();
        pom.Sort();
        LinkedList<Konto> nowa_lista = new LinkedList<Konto>(pom);
        lista_kont = nowa_lista;
    }


    public int CompareTo(Farba other)
    {
        return -this.ObliczCene().CompareTo(other.ObliczCene());
    }

فئة السلسلة غير قابلة للتغيير في حين أن StringBuilder قابلة للتغيير.

String s = "Hello";
s = s + "World";

سينشئ كود اعلاه شيئين لأن السلسلة غير قابلة للتغيير

StringBuilder sb = new StringBuilder("Hello");
sb.append("World");

كود فوق سوف يخلق كائن واحد فقط لأن StringBuilder غير قابل للتغيير.

الدرس: كلما كانت هناك حاجة للتلاعب / التحديث / إلحاق سلسلة عدة مرات ، انتقل إلى StringBuilder باعتبارها فعالة مقارنة مع String.


نجاعة.

في كل مرة تقوم بتوصيل سلاسل ، سيتم إنشاء سلسلة جديدة. فمثلا:

String out = "a" + "b" + "c";

يؤدي هذا إلى إنشاء سلسلة مؤقتة جديدة ، نسخ "a" و "b" إلى أن ينتج في "ab". ثم يقوم بإنشاء سلسلة مؤقتة وجديدة أخرى ، نسخ "ab" و "c" إلى ذلك ، ينتج في "abc". يتم تعيين هذه النتيجة out .

والنتيجة هي خوارزمية Schlemiel the Painter لدرجة تعقيد الزمن O (n²) (التربيعي).

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


StringBuilder جيد عند التعامل مع سلاسل أكبر. يساعدك على تحسين الأداء.

هنا article وجدت أنه مفيد.

كان من الممكن أن يساعدك بحث Google السريع. الآن استأجرت 7 أشخاص مختلفين للقيام ببحث جوجل لك. :)


على وجه الدقة ، StringBuilder إضافة كافة السلاسل هو O (N) أثناء إضافة String's هو O (N ^ 2). التحقق من شفرة المصدر ، يتم تحقيق ذلك داخليًا من خلال الاحتفاظ بمجموعة من الأحرف القابلة للتغيير. يستخدم StringBuilder تقنية تكرار طول الصفيف لتحقيق أداء O (N ^ 2) ، على حساب احتمال مضاعفة الذاكرة المطلوبة. يمكنك استدعاء trimToSize في النهاية لحل هذه المشكلة ، ولكن عادةً ما يتم استخدام كائنات StringBuilder مؤقتًا فقط. يمكنك تحسين الأداء بشكل أفضل من خلال توفير تخمين بدء جيد في حجم السلسلة النهائي.


StringBuilder هو ، لبناء ، سلاسل. على وجه التحديد ، بناء عليها بطريقة اداء للغاية. تعتبر فئة String جيدة للكثير من الأشياء ، ولكنها في الواقع تتمتع بأداء فظيع عندما تقوم بتجميع سلسلة جديدة من أجزاء السلسلة الصغيرة لأن كل سلسلة جديدة هي سلسلة جديدة تم إعادة تخصيصها. (إنها immutable ) يحتفظ StringBuilder بالتسلسل نفسه في المكان ويقوم بتعديله ( قابل للتغيير ).





stringbuilder