اصل: "" يا ڪنسٽرڪٽر استعمال ڪندي جاوا اسٽرنگ ٺاهيو؟ 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
هڪ ئي اعتراض ڏانهن اشارو ڪن ٿا - هڪ اسٽرنگ جو لفظي طور اعلان ڪيو ويو آهي (هيٺ ڏنل اسٽرنگ لفظي) طريقي واري علائقي ۾ (اسان پڙهندڙ کي اسان جي وسيلن تي ماخذ ڏانهن اشارو ڪيو آهي: جاوا کي سمجهڻ لاء مٿي 8 ڊراگرام ، ڊاگرام 8). جڏهن هڪ ئي اسٽرنگ لٽريريل هڪ کان وڌيڪ ڀيرا ٺاهيو ويندو آهي، صرف اسٽرنگ جي هڪ ڪاپي ميموري ۾ محفوظ ڪئي ويندي آهي، ان جو صرف هڪ مثال (اسان جي صورت ۾ "abcd"). اهو "string interning" سڏيو ويندو آهي. گڏ ڪيل وقت تي پروسيس ٿيل سڀئي اسٽرنگ مستقل جاوا ۾ خودڪار طور تي داخل ٿيل آهن. مثال 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" هميشه قسم جي String جو آهي، هڪ تعمير ڪندڙ استعمال ڪندي هڪ اضافي غير ضروري اعتراض ٺاهيندو. تنهن ڪري ڊبل حوالا استعمال ٿيڻ گهرجن جيڪڏهن توهان کي صرف هڪ تار ٺاهڻ جي ضرورت آهي. جيڪڏهن توهان اصل ۾ هيپ تي هڪ نئين شئي ٺاهڻ جي ضرورت آهي، توهان کي هڪ تعمير ڪندڙ استعمال ڪرڻ گهرجي. استعمال جا ڪيس هتي ڏيکاريا ويا آهن (اصل) . (آئون هيٺ ڏنل ترجمو ڪيل متن مهيا ڪريان ٿو. پر مان اڃا تائين تمام گهڻي صلاح ڏيان ٿو ته توهان پاڻ کي هن لنڪ تي تبصرن جي ڪوڊ سان واقف ڪيو.)substring() طريقو 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. substring() JDK 6 ۾
اسٽرنگ جو قسم صفن جي قسم جي مدد سان آھي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 قسم جي هڪ شئي تي String
هڪ طريقي کي ڪال ڪندي ٺاهيل هيپ ۾ ٻه نوان ٺهيل صفن جو حوالو ڏيندو - for , for . اهي ٻه نيون صفون هيپ تي محفوظ ڪيون وينديون ALONG جي حوالي سان ڏنل اصل صف سان. اهي. اصل صف ڪٿي به غائب ناهي. ھاڻي اچو ته واپس وڃون 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
اشارو ڪن ٿيون، اعتراض سان ملندڙ : - پهرين انڊيڪس کان 2 هين تائين عناصر ڏانهن، - 2nd انڊيڪس کان 6 هين تائين عناصر ڏانهن (نمبرنگ 0 کان شروع ٿئي ٿي، ياد ڏياريندڙ). اهي. ظاهر آهي، متغيرات تائين ڪنهن به وڌيڪ رسائي يا JDK 6 ۾ سي اصل ۾ اصل صفن جي گهربل عناصر کي "ڳڻپ" ۾ ڍير ۾ آڻيندو. JDK 7 ۾، متغير يا سي تائين ڪنهن به وڌيڪ رسائي ضروري ننڍڙن صفن تائين رسائي جو سبب بڻائيندو، جيڪي اڳ ۾ ئي ٺاهيا ويا آهن ۽ هيپ ۾ "رهندا" آهن. اهي. واضح طور تي JDK 7 اهڙين حالتن ۾ جسماني طور تي وڌيڪ ياداشت استعمال ڪندو آهي. پر اچو ته هڪ ممڪن آپشن جو تصور ڪريون: متغير جا ڪجهه ذيلي اسٽرنگ متغيرن کي تفويض ڪيا ويا آهن ، ۽ مستقبل ۾ هرڪو صرف انهن کي استعمال ڪندو آهي - شيون ۽ . ڪو به ماڻهو صرف متغير تائين رسائي نٿو ڪري سگهي؛ ان لاء ڪو به حوالو نه آهي (هي مضمون جي ليکڪ جو مطلب آهي). نتيجي طور، ڪنهن وقت ۾، ڪچرو گڏ ڪندڙ کي متحرڪ ڪيو ويندو آهي، ۽ (سڀ کان عام صورت ۾، يقينا) اسان کي 2 مختلف حالتون مليون آهن: JDK 6 : اعتراض تباهه ٿي ويو آهي (کچرو گڏ ڪيو ويو آهي) ، پر - اصل وڏو ڍير ۾ صف زنده آهي؛ اهو مسلسل استعمال ڪيو ويندو آهي ۽ . JDK 7: اعتراض a کي تباهه ڪيو ويو آهي اصل صف سان گڏ هيپ ۾. JDK 6 ۾ هي لمحو ميموري ليڪ ٿي سگھي ٿو. c
a
b
c
b
b
b
c
a
b
c
a
b
c
5. substring() 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