JavaRush /جاوا بلاگ /Random-SD /ترجمو: جاوا ۾ اسٽرنگ شيون ٺاهڻ - استعمال ڪندي " " يا ڪنسٽ...
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هڪ ئي اعتراض ڏانهن اشارو ڪن ٿا - هڪ اسٽرنگ جو لفظي طور اعلان ڪيو ويو آهي (هيٺ ڏنل اسٽرنگ لفظي) طريقي واري علائقي ۾ (اسان پڙهندڙ کي اسان جي وسيلن تي ماخذ ڏانهن اشارو ڪيو آهي: جاوا کي سمجهڻ لاء مٿي 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 ۾، ڪلاس ۾ String3 فيلڊ شامل آهن: 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()StringLbongLcaLongLongStringaLongLongString
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 ۾ هي لمحو ميموري ليڪ ٿي سگھي ٿو. cabcbbbcabcabc

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);
}
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION