اصل: "" یا کنسٹرکٹر کا استعمال کرتے ہوئے جاوا سٹرنگ بنائیں؟ 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()
String
L
b
ongL
c
aLongLongString
aLongLongString
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 میں یہ لمحہ میموری لیک ہونے کا باعث بن سکتا ہے۔ c
a
b
c
b
b
b
c
a
b
c
a
b
c
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);
}
GO TO FULL VERSION