JavaRush /جاوا بلاگ /Random-UR /ترجمہ: جاوا میں سٹرنگ آبجیکٹ بنانا - " " یا کنسٹرکٹر کا ا...
FellowSparrow
سطح
Lvov

ترجمہ: جاوا میں سٹرنگ آبجیکٹ بنانا - " " یا کنسٹرکٹر کا استعمال کرتے ہوئے؟

گروپ میں شائع ہوا۔
اصل: "" یا کنسٹرکٹر کا استعمال کرتے ہوئے جاوا سٹرنگ بنائیں؟ X Wang کی طرف سے ترجمہ: جاوا میں سٹرنگ آبجیکٹ بنانا - استعمالجاوا میں، دو طریقوں کا استعمال کرتے ہوئے ایک تار بنایا جا سکتا ہے:
String x = "abc";
String y = new String("abc");
ڈبل کوٹس استعمال کرنے اور کنسٹرکٹر کے استعمال میں کیا فرق ہے؟

1. ڈبل کوٹس بمقابلہ کنسٹرکٹر

اس سوال کا جواب دو سادہ مثالوں کو دیکھ کر دیا جا سکتا ہے۔ مثال 1:
String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True
a==bسچ ہے کیونکہ وہ aدونوں bایک ہی چیز کا حوالہ دیتے ہیں - طریقہ کے علاقے میں لٹریل (نیچے سٹرنگ لٹریل) کے طور پر اعلان کردہ ایک سٹرنگ (ہم قاری کو اپنے وسائل پر ماخذ کا حوالہ دیتے ہیں: Java کو سمجھنے کے لیے ٹاپ 8 ڈایاگرام ، ڈایاگرام 8)۔ جب ایک ہی سٹرنگ لٹریل ایک سے زیادہ بار بنائی جاتی ہے، تو اسٹرنگ کی صرف ایک کاپی میموری میں محفوظ ہوتی ہے، اس کی صرف ایک مثال (ہمارے معاملے میں "abcd")۔ اسے "سٹرنگ انٹرننگ" کہا جاتا ہے۔ کمپائل کے وقت پروسیس ہونے والے تمام سٹرنگ کنسٹینٹ خود بخود جاوا میں داخل ہو جاتے ہیں۔ مثال 2:
String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True
c==dغلط کیونکہ cوہ dمیموری میں دو مختلف اشیاء کا حوالہ دیتے ہیں (ڈھیر پر)۔ مختلف اشیاء کے ہمیشہ مختلف حوالہ جات ہوتے ہیں۔ یہ خاکہ اوپر بیان کردہ دو صورتوں کی وضاحت کرتا ہے: ترجمہ: جاوا میں سٹرنگ آبجیکٹ بنانا - استعمال

2. پروگرام کے عمل کے مرحلے پر انٹرننگ سٹرنگز

مصنف LukasEder کا شکریہ ادا کرتا ہے (ذیل میں تبصرہ اس کا ہے): سٹرنگ انٹرننگ پروگرام کے عمل کے دوران بھی ہو سکتی ہے، چاہے کنسٹرکٹرز کا استعمال کرتے ہوئے دو تار بنائے جائیں۔
String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

3. ڈبل کوٹس کب استعمال کریں اور کنسٹرکٹرز کب استعمال کریں۔

اس حقیقت کی وجہ سے کہ لفظی "abcd" ہمیشہ اسٹرنگ کی قسم کا ہوتا ہے، کنسٹرکٹر کا استعمال ایک اضافی غیر ضروری چیز پیدا کرے گا۔ لہذا اگر آپ کو صرف سٹرنگ بنانے کی ضرورت ہو تو ڈبل کوٹس استعمال کیے جائیں۔ اگر آپ کو درحقیقت ہیپ پر کوئی نئی آبجیکٹ بنانے کی ضرورت ہے تو آپ کو کنسٹرکٹر استعمال کرنا چاہیے۔ استعمال کے معاملات یہاں دکھائے گئے ہیں (اصل) ۔ (میں ذیل میں ترجمہ شدہ متن فراہم کرتا ہوں۔ لیکن میں پھر بھی انتہائی سفارش کرتا ہوں کہ آپ اس لنک پر تبصرہ نگاروں کے کوڈ سے واقف ہوں۔)

JDK 6 اور JDK 7 میں سبسٹرنگ () طریقہ

JDK 6 اور JDK 7 میں substring() طریقہsubstring(int beginIndex, int endIndex) X Wang کے ذریعے JDK 6 اور JDK 7 میں طریقہ مختلف ہے۔ ان اختلافات کو جاننے سے آپ کو اس طریقہ کو بہتر طریقے سے استعمال کرنے میں مدد مل سکتی ہے۔ پڑھنے میں آسانی کی خاطر، ذیل میں substring()ہم مکمل نحو مراد لیں گے، یعنی substring(int beginIndex, int endIndex).

1. substring() کیا کرتا ہے؟

طریقہ substring(int beginIndex, int endIndex)ایک سٹرنگ لوٹاتا ہے جو کریکٹر نمبر سے شروع ہوتا ہے beginIndexاور کریکٹر نمبر پر ختم ہوتا ہے endIndex-1۔
String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);
آؤٹ پٹ:
bc

2. جب substring() کہا جاتا ہے تو کیا ہوتا ہے؟

آپ کو معلوم ہو سکتا ہے کہ، متغیر ہونے کی وجہ سے x، x کا نتیجہ تفویض کرتے وقت x.substring(1,3)، xیہ بالکل نئی قطار کی طرف اشارہ کرتا ہے (ڈائیگرام دیکھیں): ترجمہ: جاوا میں سٹرنگ آبجیکٹ بنانا - استعمالتاہم، یہ خاکہ مکمل طور پر درست نہیں ہے۔ یہ ظاہر نہیں کرتا کہ ڈھیر میں اصل میں کیا ہو رہا ہے۔ اصل میں کیا ہوتا ہے جب کہا جاتا ہے substring()JDK 6 اور JDK 7 میں مختلف ہے۔

3. سبسٹرنگ () JDK 6 میں

سٹرنگ کی قسم کو array type سے تعاون حاصل ہے char۔ JDK 6 میں، کلاس Stringمیں 3 فیلڈز ہیں: char value[], int offset, int count. وہ حروف کی اصل صف، صف میں پہلے کردار کا اشاریہ، لائن میں حروف کی تعداد کو ذخیرہ کرنے کے لیے استعمال ہوتے ہیں۔ جب طریقہ کو کہا جاتا ہے substring()، تو یہ ایک نئی قطار بناتا ہے، لیکن متغیر کی قدر اب بھی ہیپ پر ایک ہی صف کی طرف اشارہ کرتی ہے۔ دو تاروں کے درمیان فرق ان کے حروف کی تعداد اور صف میں شروع ہونے والے کردار کی انڈیکس قدر ہے۔ ترجمہ: جاوا میں سٹرنگ آبجیکٹ بنانا - استعمالذیل کا کوڈ آسان بنایا گیا ہے اور اس میں مسئلہ کو ظاہر کرنے کے لیے صرف بنیادی باتیں شامل ہیں۔
//JDK 6
String(int offset, int count, char value[]) {
	this.value = value;
	this.offset = offset;
	this.count = count;
}

public String substring(int beginIndex, int endIndex) {
	//check boundary
	return  new String(offset + beginIndex, endIndex - beginIndex, value);
}

4. JDK 6 میں substring() کی وجہ سے مسئلہ

اگر آپ کے پاس بہت لمبی تار ہے، لیکن آپ کو اس کا صرف ایک چھوٹا سا حصہ درکار ہے، جو آپ کو ہر بار استعمال کرتے ہوئے ملتا ہے substring()۔ یہ عمل درآمد کے مسائل کا سبب بنے گا، کیونکہ آپ کو صرف ایک چھوٹے سے حصے کی ضرورت ہے، لیکن پھر بھی آپ کو پوری تار کو ذخیرہ کرنا ہوگا۔ JDK 6 کے لیے، حل ذیل میں دیا گیا کوڈ ہے، جو سٹرنگ کو ایک حقیقی سبسٹرنگ میں ڈال دے گا۔
x = x.substring(x, y) + ""
صارف STepeR نے ایک سوال تیار کیا (اس کا تبصرہ دیکھیں)، اور اسے پوائنٹ 4 شامل کرنا ضروری معلوم ہوا۔ substring()" JDK 6 میں پیدا ہونے والی پریشانی " ایک زیادہ وسیع مثال ہے۔ مجھے امید ہے کہ یہ جواب ہو گا اور دوسروں کو یہ جاننے میں مدد کرے گا کہ مسئلہ کیا ہے۔ یہ کوڈ ہے:
String a = "aLongLongString";
String b = a.substring(1, 2);
String c = a.substring(2, 6);
لہذا، JDK 7 میں b، сقسم a کی آبجیکٹ a قسم کے کسی آبجیکٹ پر Stringمیتھڈ کو کال کرکے ہیپ میں دو نئی تخلیق کردہ صفوں کا حوالہ دیں گی - for , for ۔ یہ دو نئی صفوں کو a کے ذریعہ حوالہ کردہ اصل ارے کے ساتھ ہیپ پر محفوظ کیا جائے گا ۔ وہ. اصل صف کہیں غائب نہیں ہوتی ہے۔ اب JDK 6 کی طرف لوٹتے ہیں۔ JDK 6 میں، ایک ہیپ ایک ہی صف پر مشتمل ہے ۔ کوڈ کی لائنوں پر عمل درآمد کے بعد substring()StringLbongLcaLongLongStringaLongLongString
String b = a.substring(1, 2);
String c = a.substring(2, 6);
آبجیکٹ ہیپ میں ایک ہی صف کا bحوالہ دیتے ہیں ، آبجیکٹ کے مطابق : - 1st انڈیکس سے 2nd تک کے عناصر، - 2nd انڈیکس سے 6ویں تک کے عناصر (نمبرنگ 0 سے شروع ہوتی ہے، یاد دہانی)۔ وہ. ظاہر ہے، JDK 6 میں متغیرات یا c تک مزید رسائی کے نتیجے میں اصل صف کے مطلوبہ عناصر ہیپ میں "گنے" جائیں گے۔ JDK 7 میں، متغیرات یا c تک مزید رسائی ضروری چھوٹی صفوں تک رسائی کا سبب بنے گی، جو پہلے ہی بن چکی ہیں اور ہیپ میں "لائیو" ہیں۔ وہ. واضح طور پر JDK 7 اس طرح کے حالات میں جسمانی طور پر زیادہ میموری استعمال کرتا ہے۔ لیکن آئیے ایک ممکنہ آپشن کا تصور کرتے ہیں: متغیر کے کچھ ذیلی اسٹرنگ متغیر کو تفویض کیے گئے ہیں ، اور مستقبل میں ہر کوئی صرف ان کا استعمال کرتا ہے - آبجیکٹ اور ۔ اب کوئی بھی متغیر تک رسائی حاصل نہیں کرتا ہے؛ اس کا کوئی حوالہ نہیں ہے (مضمون کے مصنف کا یہی مطلب ہے)۔ نتیجے کے طور پر، کسی وقت، کچرا جمع کرنے والا متحرک ہو جاتا ہے، اور (بلاشبہ سب سے عام شکل میں) ہمیں 2 مختلف حالات ملتے ہیں: JDK 6 : آبجیکٹ تباہ ہو جاتا ہے (کوڑا جمع کیا جاتا ہے) ، لیکن - اصل بہت بڑا ڈھیر میں صف زندہ ہے؛ یہ مسلسل استعمال کیا جاتا ہے اور JDK 7: آبجیکٹ اے ہیپ میں اصل صف کے ساتھ تباہ ہو جاتا ہے۔ JDK 6 میں یہ لمحہ میموری لیک ہونے کا باعث بن سکتا ہے۔ cabcbbbcabcabc

5. سبسٹرنگ () JDK 7 میں

طریقہ JDK 7 میں بہتر کیا گیا ہے۔ JDK 7 میں substring()یہ دراصل ہیپ پر ایک نئی صف بناتا ہے۔ ترجمہ: جاوا میں سٹرنگ آبجیکٹ بنانا - استعمال
//JDK 7
public String(char value[], int offset, int count) {
	//check boundary
	this.value = Arrays.copyOfRange(value, offset, offset + count);
}

public String substring(int beginIndex, int endIndex) {
	//check boundary
	int subLen = endIndex - beginIndex;
	return new String(value, beginIndex, subLen);
}
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION