JavaRush /جاوا بلاگ /Random-UR /جاوا میں String، StringBuffer اور StringBuilder کا تعارف

جاوا میں String، StringBuffer اور StringBuilder کا تعارف

گروپ میں شائع ہوا۔
ٹیکسٹ ڈیٹا کے ساتھ کام کرنے کے لیے جاوا میں تین کلاسز ہیں: String ، StringBuffer اور StringBuilder ۔ ہر ڈویلپر کا سامنا زبان سیکھنے کے بالکل شروع میں ہی ہوتا ہے۔ باقی دو کا کیا ہوگا؟ ان کے اختلافات کیا ہیں، اور ایک یا دوسری کلاس کا استعمال کب بہتر ہے؟ عام طور پر، ان کے درمیان فرق چھوٹا ہے، لیکن عملی طور پر ہر چیز کو سمجھنا بہتر ہے :) جاوا میں String، StringBuffer اور StringBuilder کا تعارف - 1

سٹرنگ کلاس

یہ کلاس حروف کی ترتیب کی نمائندگی کرتی ہے۔ پروگراموں میں بیان کردہ تمام سٹرنگ لٹریلز، جیسے "یہ اسٹرنگ ہے" سٹرنگ کلاس کی مثالیں ہیں۔ اسٹرنگ کی دو بنیادی خصوصیات ہیں:
  • یہ ایک ناقابل تغیر کلاس ہے۔
  • یہ فائنل کلاس ہے
عام طور پر، String کلاس میں بچے ( ) نہیں ہو سکتے اور تخلیق ( ) finalکے بعد کلاس کی مثالوں میں ترمیم نہیں کی جا سکتی ۔ immutableیہ String کلاس کو کئی اہم فوائد دیتا ہے:
  1. غیر متغیر ہونے کی وجہ سے، String کلاس کی ایک مثال کے ہیش کوڈ کو کیش کیا جاتا ہے۔ اسے ہر بار جانچنے کی ضرورت نہیں ہے کیونکہ آبجیکٹ کے بننے کے بعد اس کی فیلڈ ویلیوز کبھی تبدیل نہیں ہوں گی۔ اس کلاس کو کلید کے بطور استعمال کرتے وقت یہ اعلی کارکردگی دیتا ہے HashMap۔

  2. سٹرنگ کلاس کو کثیر تھریڈ والے ماحول میں بغیر کسی اضافی مطابقت پذیری کے استعمال کیا جا سکتا ہے۔

  3. سٹرنگ کلاس کی ایک اور خصوصیت یہ ہے کہ یہ +جاوا میں " " آپریٹر کو اوورلوڈ کرتا ہے۔ لہذا، تاروں کا جوڑنا (اضافہ) بہت آسان ہے:

public static void main(String[] args) {
    String command = "Follow" + " " + "the" + " " + "white" + " " + "rabbit";
    System.out.println(command); // Follow the white rabbit
}
ہڈ کے تحت، سٹرنگ کنکٹنیشن StringBuilder یا StringBuffer کلاس (مرتب کی صوابدید پر) اور ایک طریقہ append(ہم ان کلاسز کے بارے میں تھوڑی دیر بعد بات کریں گے) کے ذریعے انجام دیا جاتا ہے۔ اگر ہم سٹرنگ کلاس کی مثالیں دوسری کلاسوں کی مثالوں کے ساتھ شامل کرتے ہیں، تو مؤخر الذکر کو سٹرنگ کی نمائندگی میں کم کر دیا جائے گا:
public static void main(String[] args) {
    Boolean b = Boolean.TRUE;
    String result = "b is " + b;
    System.out.println(result); //b is true
}
toString()یہ اسٹرنگ کلاس کی ایک اور دلچسپ خاصیت ہے: کسی بھی کلاس کی اشیاء کو کلاس میں بیان کردہ طریقہ کار کا استعمال کرتے ہوئے سٹرنگ کی نمائندگی میں ڈالا جا سکتا ہے Objectاور دیگر تمام کلاسوں سے وراثت میں ملا ہے۔ اکثر کسی چیز پر toString() طریقہ کو مضمر طور پر کہا جاتا ہے۔ مثال کے طور پر، جب ہم اسکرین پر کوئی چیز دکھاتے ہیں یا کسی دوسری کلاس کی کسی چیز میں String شامل کرتے ہیں۔ سٹرنگ کلاس میں ایک اور خصوصیت ہے۔ جاوا کوڈ میں بیان کردہ تمام سٹرنگ لٹریلز، جیسے "asdf"، مرتب وقت پر کیش کیے جاتے ہیں اور نام نہاد سٹرنگ پول میں شامل کیے جاتے ہیں۔ اگر ہم درج ذیل کوڈ کو چلاتے ہیں:
String a = "Wake up, Neo";
String b = "Wake up, Neo";

System.out.println(a == b);
ہم کنسول میں سچ دیکھیں گے کیونکہ متغیرات aدراصل bسٹرنگ کلاس کی اسی مثال کا حوالہ دیں گے جو مرتب کے وقت سٹرنگ پول میں شامل کیا گیا تھا۔ یعنی ایک ہی قدر والی کلاس کی مختلف مثالیں تخلیق نہیں ہوتیں اور میموری محفوظ ہوجاتی ہے۔

خامیوں:

یہ اندازہ لگانا مشکل نہیں ہے کہ بنیادی طور پر سٹرنگ کے ساتھ کام کرنے کے لیے String کلاس کی ضرورت ہے۔ لیکن کچھ معاملات میں، String کلاس کی مندرجہ بالا خصوصیات فوائد سے نقصانات میں بدل سکتی ہیں۔ ایک بار جاوا کوڈ میں سٹرنگز بن جانے کے بعد، ان پر اکثر آپریشن کیے جاتے ہیں:
  • تاروں کو مختلف رجسٹروں میں تبدیل کرنا؛
  • سبسٹرنگ نکالنا؛
  • جوڑنا
  • وغیرہ
آئیے اس کوڈ کو دیکھیں:
public static void main(String[] args) {

    String s = " Wake up, Neo! ";
    s = s.toUpperCase();
    s = s.trim();

    System.out.println("\"" + s + "\"");
}
پہلی نظر میں، ایسا لگتا ہے کہ ہم نے صرف اس لائن کا ترجمہ کیا ہے "جاگو، نو!" بڑے حروف میں، اس سٹرنگ سے اضافی خالی جگہیں ہٹا دیں اور اسے کوٹس میں لپیٹ دیں۔ درحقیقت، سٹرنگ کلاس کی غیر متغیر ہونے کی وجہ سے، ہر آپریشن کے نتیجے میں، نئی سٹرنگ مثالیں بنتی ہیں اور پرانے کو ضائع کر دیا جاتا ہے، جس سے بڑی مقدار میں کوڑا کرکٹ پیدا ہوتا ہے۔ یادداشت کے ضیاع سے کیسے بچا جائے؟

StringBuffer کلاس

String آبجیکٹ میں ترمیم کی وجہ سے عارضی کوڑے کی تخلیق کو سنبھالنے کے لیے، آپ StringBuffer کلاس استعمال کر سکتے ہیں۔ یہ mutableایک کلاس ہے، یعنی بدلنے والا StringBuffer کلاس کی ایک آبجیکٹ میں حروف کا ایک مخصوص سیٹ ہو سکتا ہے، جس کی لمبائی اور قدر کو کچھ طریقوں سے کال کرکے تبدیل کیا جا سکتا ہے۔ آئیے دیکھتے ہیں کہ یہ کلاس کیسے کام کرتی ہے۔ ایک نیا آبجیکٹ بنانے کے لیے، اس کے کنسٹرکٹرز میں سے ایک استعمال کریں، مثال کے طور پر:
  • StringBuffer() - ایک خالی (کوئی حروف نہیں) آبجیکٹ بنائے گا۔
  • StringBuffer(String str) - str متغیر کی بنیاد پر ایک آبجیکٹ بنائے گا (جس میں str کے تمام حروف ایک ہی ترتیب میں ہوں گے)
مشق:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
جاوا میں StringBuffer کے ذریعے سٹرنگ کنکٹنیشن کا استعمال کرتے ہوئے کیا جاتا ہے append۔ عام طور پر، StringBuffer کلاس میں طریقہ appendاس طرح اوورلوڈ ہوتا ہے کہ یہ تقریباً کسی بھی قسم کے ڈیٹا کو قبول کر سکتا ہے۔
public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();

    sb.append(new Integer(2));
    sb.append("; ");
    sb.append(false);
    sb.append("; ");
    sb.append(Arrays.asList(1,2,3));
    sb.append("; ");

    System.out.println(sb); // 2; false; [1, 2, 3];
}
طریقہ appendاس چیز کو لوٹاتا ہے جس پر اسے بلایا گیا تھا (بہت سے دوسرے طریقوں کی طرح)، جو اسے "زنجیر" میں بلانے کی اجازت دیتا ہے۔ مندرجہ بالا مثال کو اس طرح لکھا جا سکتا ہے:
public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();

    sb.append(new Integer(2))
            .append("; ")
            .append(false)
            .append("; ")
            .append(Arrays.asList(1,2,3))
            .append("; ");

    System.out.println(sb); // 2; false; [1, 2, 3];
}
StringBuffer کلاس میں سٹرنگز کے ساتھ کام کرنے کے کئی طریقے ہیں۔ آئیے اہم کی فہرست بنائیں:
  • delete(int start, int end)— پوزیشن سے شروع ہونے والے حروف کے ذیلی اسٹرنگ کو حذف کرتا ہے start، ختم ہوتا ہے۔end
  • deleteCharAt(int index)- پوزیشن پر کردار کو حذف کرتا ہے۔index
  • insert(int offset, String str)- strپوزیشن پر ایک لائن داخل کرتا ہے offset۔ طریقہ insertبھی اوورلوڈ ہے اور مختلف دلائل لے سکتا ہے۔
  • replace(int start, int end, String str)- تمام حروف کو پوزیشن سے startپوزیشن تک endبدل دے گا۔str
  • reverse()- تمام حروف کی ترتیب کو الٹ دیتا ہے۔
  • substring(int start)- پوزیشن سے شروع ہونے والی سبسٹرنگ واپس کرے گا۔ start
  • substring(int start, int end)start- پوزیشن سے پوزیشن تک شروع ہونے والی سبسٹرنگ واپس کرے گا۔end
طریقوں اور تعمیر کنندگان کی مکمل فہرست سرکاری دستاویزات میں موجود ہے ۔ مندرجہ بالا طریقے کیسے کام کرتے ہیں؟ آئیے عملی طور پر دیکھتے ہیں:
public static void main(String[] args) {
     String numbers = "0123456789";

     StringBuffer sb = new StringBuffer(numbers);

     System.out.println(sb.substring(3)); // 3456789
     System.out.println(sb.substring(4, 8)); // 4567
     System.out.println(sb.replace(3, 5, "ABCDE")); // 012ABCDE56789

     sb = new StringBuffer(numbers);
     System.out.println(sb.reverse()); // 9876543210
     sb.reverse(); // Return the original order

     sb = new StringBuffer(numbers);
     System.out.println(sb.delete(5, 9)); // 012349
     System.out.println(sb.deleteCharAt(1)); // 02349
     System.out.println(sb.insert(1, "One")); // 0One2349
    }

فوائد:

  1. جیسا کہ پہلے ہی ذکر کیا گیا ہے، StringBuffer ایک تغیر پذیر کلاس ہے، لہذا اس کے ساتھ کام کرنے سے اتنی ہی مقدار میں میموری کوڑا پیدا نہیں ہوتا جتنا String کے ساتھ ہوتا ہے۔ لہذا، اگر سٹرنگز میں بہت زیادہ ترامیم کی جائیں، تو اسے استعمال کرنا بہتر ہے StringBuffer۔

  2. StringBuffer ایک تھریڈ سیف کلاس ہے۔ اس کے طریقے مطابقت پذیر ہیں اور مثالیں بیک وقت متعدد تھریڈز کے ذریعے استعمال کی جا سکتی ہیں۔

خامیوں:

ایک طرف، دھاگے کی حفاظت کلاس کا ایک فائدہ ہے، اور دوسری طرف، یہ ایک نقصان ہے۔ مطابقت پذیر طریقے غیر مطابقت پذیر طریقوں سے سست ہیں۔ یہ وہ جگہ ہے جہاں StringBuilder کھیل میں آتا ہے۔ آئیے معلوم کریں کہ یہ کس قسم کی جاوا کلاس ہے - StringBuilder، اس کے کیا طریقے ہیں اور اس کی خصوصیات کیا ہیں۔

StringBuilder کلاس

جاوا میں StringBuilder ایک کلاس ہے جو حروف کی ترتیب کی نمائندگی کرتی ہے۔ یہ تھریڈ سیفٹی کے علاوہ ہر طرح سے StringBuffer سے بہت ملتا جلتا ہے۔ StringBuilder StringBuffer کی طرح ایک API فراہم کرتا ہے۔ آئیے پہلے سے واقف مثال کا استعمال کرتے ہوئے اس کا مظاہرہ کرتے ہیں، StringBufer سے StringBuilder میں متغیرات کے اعلان کی جگہ:
public static void main(String[] args) {
    String numbers = "0123456789";

    StringBuilder sb = new StringBuilder(numbers);

    System.out.println(sb.substring(3)); //3456789
    System.out.println(sb.substring(4, 8)); //4567
    System.out.println(sb.replace(3, 5, "ABCDE")); //012ABCDE56789

    sb = new StringBuilder(numbers);
    System.out.println(sb.reverse()); //9876543210
    sb.reverse(); // Return the original order

    sb = new StringBuilder(numbers);
    System.out.println(sb.delete(5, 9)); //012349
    System.out.println(sb.deleteCharAt(1)); //02349
    System.out.println(sb.insert(1, "One")); //0One2349
}
فرق صرف یہ ہے کہ StringBuffer تھریڈ محفوظ ہے اور اس کے تمام طریقے مطابقت پذیر ہیں، جبکہ StringBuilder نہیں ہے۔ یہ واحد خصوصیت ہے۔ جاوا میں StringBuilder طریقوں کی غیر مطابقت پذیری کی وجہ سے StringBuffer سے تیز ہے۔ لہٰذا، زیادہ تر معاملات میں، سوائے ملٹی تھریڈڈ ماحول کے، جاوا پروگرام کے لیے StringBuilder کا استعمال کرنا بہتر ہے۔ ہم تین کلاسوں کے تقابلی جدول میں ہر چیز کا خلاصہ کرتے ہیں:

سٹرنگ بمقابلہ سٹرنگ بفر بمقابلہ سٹرنگ بلڈر

تار StringBuffer StringBuilder
تبدیلی کی صلاحیت Immutable(نہیں) mutable(جی ہاں) mutable(جی ہاں)
توسیع پذیری۔ final(نہیں) final(نہیں) final(نہیں)
دھاگے کی حفاظت ہاں، ناقابل تغیر ہونے کی وجہ سے ہاں، مطابقت پذیری کی وجہ سے نہیں
کب استعمال کرنا ہے۔ تاروں کے ساتھ کام کرتے وقت جس میں شاذ و نادر ہی ترمیم کی جائے گی۔ سٹرنگز کے ساتھ کام کرتے وقت جن میں کثیر تھریڈڈ ماحول میں بار بار ترمیم کی جائے گی۔ تاروں کے ساتھ کام کرتے وقت جن میں ایک ہی تھریڈڈ ماحول میں اکثر ترمیم کی جائے گی۔
آپ JavaRush کورس میں جاوا ملٹی تھریڈنگ کی تلاش کے دوسرے درجے پر اس موضوع کا مزید تفصیل سے مطالعہ کر سکتے ہیں:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION