dotnet-müsahibe-suallari-toplusu--string-ve-stringbuilder-klaslarinin-ferqi

.NET müsahibə sualları toplusu: String və StringBuilder klaslarının fərqi

Deməli son bir ayda artıq 3 , tədris müddətimdə isə onlarla tələbəmə  intervyuda “String ilə StringBuilder arasındakı fərqlər nələrdir?” sualını veriblər.  Məqalənin adından da məlum olduğu kimi, bu gün bu sualı cavablandırmağa çalışacağıq.

PS: Java dilini öyrənənlər də bu sualın cavabını bilməlidirlər. Çünki eyni sual Java dilində də keçərlidir.

               Mən çox təəssüflənirəm ki, bir çox tələbələr öyrəndikləri mövzuları dərininə yox, sanki candərdi yola verib pul qazanmaq üçün öyrənirlər. Ona görə də bir çox məsələlərin dərinliklərini başa düşmürlər. Hazırda müzakirə edəcəyimiz mövzu ,tədris müddətimdə .NET-in ikinci ayında tədris etdiyim mövzulardan biridir.

               Bildiyimiz kimi, string class-ı mətn tipli informasiyaları operativ yaddaşda saxlamaq üçündür. String tipində dəyişənin informasiya saxlama tutumu 2GB-dır. Yəni istənilən bir ölçüdə məlumatı operativ yaddaşda string vasitəsilə saxlaya bilərik.

String klasinin hansı minusu varki StringBuilder klasını istifadə etmək ehtiyacı duyuruq?

-String klasının tək minusu onun dəyişməz olmasıdır(immutable)!! Bəli string klası tipində elan olunmuş hər hansı bir dəyişənə məlumat mənimsətdikdə həmin informasiyanı sonradan dəyişmək olmur!

               Bəli, məsələ odurki, çoxunuzun ağlına belə bir kod hissəsi gəlir .

            //sadə dəyişən elan olunur
            string str = "some data";


            //str-dəki köhnə informasiya yaddaşda ilişib qalır! 
            //sadəcə dəyişən yeni informasiyaya link saxlayır!!!
            str = "data changed";

Bununla da string-in dəyişdiyini düşünürsünüz. Əslində, string tipi dəyişilməzdir yəni immutable-dır.

Yuxarıdakı kod nümunəsində ilk öncə str dəyişəni elan olunur və ona müəyyən məlumat yazılır. Burda tələ ondan ibarətdir ki, əgər str dəyişəninə başqa qiymət mənimsətsək başqa dəyişən tiplərində olduğu kimi, köhnə qiymətin üzərinə yazılma baş vermir!! Yəni “some data” məlumatı Operativ yaddaşda haradasa bir yerlərdə ilişib qalır, silinmir. Str dəyişəni isə sadəcə yeni informasiyanın yerləşdiyi yaddaş sahəsinə lnk saxlayır!!

               İndi siz düşünün ki, dövr əməliyyatları istifadə edərək string dəyişəninə qiymət konkotenasiya etdikdə yaddaşı həddindən artıq zibilləyirsiniz.

        static string ReverseString(string value)
        {
            string reversedData = String.Empty;
            for(int i=value.Length-1;i>=0;i--)
            {
                reversedData += value[i];
                Console.WriteLine($"New data stored separately as '{reversedData}'");
            }
            return reversedData;
        }

Yuxarıdakı kod nümunəsi çox zəif yazılmış bir koddur çünki yaddaş sahəsini optimal istifadə etmir. Gəlin yaddaşda nə hadisə baş verdiyini nəzərdən keçirək.

Deməli yuxarıdakı metodumuz bütün string məlumatları tərsinə düzmək üçün istifadə olunur. Alqoritm işləyir amma yaddaş sahəsini boşuna həddən artıq yükləmiş oluruq. Metodumuzu çağırıb ona data changed sözünü ötürürük.  Birinci dövr zamanı reversedData dəyişəninə d hərfi düşür. İkinci dövr zamanı artıq d hərfi olan yaddaş sahəsinə manipulyasiya olmur!!! Çünki string dəyişməzdir(immutable). Bu dəfə sadəcə yeni yaddaş sahəsi ayrılır və orada de frazası saxlanılır. 3cü dövrdə isə bu dəfə de frazası olan yaddaş sahəsinə manipulyasiya olunur, yəni override olunma baş vermir, yenə də yeni yaddaş yeri ayrılır və bu dəfə deg ifadəsi orada saxlanılır. Gördüyümüz kimi, bu proses sona kimi belə davam edir və yaddaşda linki olmayan boşuna məlumatlar yaranır. Ötürülən parametrin həcmindən asılı olaraq yaddaş çox və ya az çirklənə bilər. Metodu icra etdikdə belə bir nəticə alırıq.

Deməli dövr prosesində köhnə yaddaş sahəsinin üzərinə yazılma hadisəsi baş vermir, əksinə hər bir konkotenasiya üçün ayrı yaddaş sahəsi ayrılır!

               Məhz bu yaddaş problemini aradan qaldırmaq üçün StringBuilder klası yaradılıb.

StringBuilder klası vasitəsilə biz hər bir dəyişənə ayrı yaddaş sahəsi ayrılması problemini həll edirik. StringBuilder cəmi 1 dinamik genişlənən yaddaş sahəsi ayıraraq hər konkotenasiya(string məlumatlarının birləşdirilməsi) zamanı cəmi 1 yaddaş sahəsi istifadə edir. Bununla da yaddaşda boşuna yer ayrılmasının qarşısı alınır. Yuxarıda string ilə həll etdiyimiz tapşırığı daha düzgün formada StringBuilder ilə belə həll edə bilərik:

 static string ReverseStringWithBuilder(string value)
        {
            StringBuilder reversedData = new StringBuilder();
            for (int i = value.Length - 1; i >= 0; i--)
            {
                reversedData.Append(value[i]);
                Console.WriteLine($"New data stored separately as '{reversedData}'");
            }
            return reversedData.ToString();
        }

 

Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz