JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ اسٽرنگ (ڪلاس java.lang.String)
Viacheslav
سطح

جاوا ۾ اسٽرنگ (ڪلاس java.lang.String)

گروپ ۾ شايع ٿيل

تعارف

هڪ پروگرامر جو رستو هڪ پيچيده ۽ ڊگهو عمل آهي. ۽ اڪثر ڪيسن ۾ اهو هڪ پروگرام سان شروع ٿئي ٿو جيڪو ڏيکاري ٿو هيلو ورلڊ اسڪرين تي. جاوا ڪو به استثنا نه آهي (ڏسو سبق: "هيلو ورلڊ!" ايپليڪيشن ). جيئن اسان ڏسي سگهون ٿا، پيغام آئوٽ پٽ آهي استعمال ڪندي System.out.println("Hello World!"); جيڪڏهن توهان جاوا API کي ڏسو، System.out.println طريقو String کي ان پٽ پيٽرولر طور وٺندو آهي . ڊيٽا جي هن قسم جي ڳالهه ٻولهه ڪئي ويندي.

اکرن جي تسلسل طور اسٽرنگ

دراصل، انگريزيءَ مان ترجمو ڪيل String ھڪ اسٽرنگ آھي. اهو صحيح آهي، اسٽرنگ جو قسم متن جي اسٽرنگ جي نمائندگي ڪري ٿو. ٽيڪسٽ اسٽرنگ ڇا آهي؟ ٽيڪسٽ اسٽرنگ ڪجهه قسم جي ترتيب ڏنل ڪردارن جي ترتيب آهي جيڪي هڪ ٻئي جي پيروي ڪندا آهن. علامت چار آهي. تسلسل- تسلسل. تنهن ڪري ها، بلڪل صحيح، String هڪ عمل درآمد آهي java.lang.CharSequence. ۽ جيڪڏھن توھان خود اسٽرنگ ڪلاس جي اندر ڏسندا، ته ان جي اندر اکر جي صف کان وڌيڪ ڪجھ به نه آھي: private final char value[]; اھو java.lang.CharSequenceھڪڙو سادو معاهدو آھي:
جاوا ۾ اسٽرنگ (ڪلاس java.lang.String) - 1
اسان وٽ عناصرن جو تعداد حاصل ڪرڻ، مخصوص عنصر حاصل ڪرڻ ۽ عناصر جو ھڪڙو سيٽ حاصل ڪرڻ لاءِ ھڪڙو طريقو آھي + toString جو طريقو، جيڪو ھي واپس ڪندو) انھن طريقن کي سمجھڻ وڌيڪ دلچسپ آھي جيڪي اسان وٽ جاوا 8 ۾ آيا آھن، ۽ ھي آھي. : chars()۽ codePoints() ياد ڪريو سبق مان Oracle “ Primitive Data” Types “ that is char is single 16-bit Unicode character. يعني، بنيادي طور تي چار هڪ قسم آهي اڌ سائيز جي هڪ int (32 بٽ) جيڪو 0 کان 65535 تائين انگن جي نمائندگي ڪري ٿو (ڏسو ڊيسيمل ويلز ASCII ٽيبل ۾ ). اهو آهي، جيڪڏهن اسان چاهيون ٿا، اسان چار کي int طور نمائندگي ڪري سگهون ٿا. ۽ جاوا 8 هن جو فائدو ورتو. جاوا جي ورزن 8 سان شروع ڪندي، اسان وٽ آھي IntStream - ھڪ اسٽريم آھي ڪم ڪرڻ لاءِ ابتدائي انٽس سان. تنهن ڪري، charSequence ۾ اهو حاصل ڪرڻ ممڪن آهي هڪ IntStream يا ته ڪردار يا ڪوڊ پوائنٽ جي نمائندگي ڪري. ان کان اڳ جو اسين انھن ڏانھن وڃون، اسان ھڪ مثال ڏسنداسين ته جيئن ھن طريقي جي سھولت ڏيکاري. اچو ته Tutorialspoint آن لائن جاوا ڪمپلر استعمال ڪريون ۽ ڪوڊ تي عمل ڪريو:
public static void main(String []args){
        String line = "aaabccdddc";
        System.out.println( line.chars().distinct().count() );
}
ھاڻي توھان ھن سادي طريقي سان ڪيترائي منفرد نشان حاصل ڪري سگھو ٿا.

ڪوڊ پوائنٽس

تنهن ڪري، اسان چارن بابت ڏٺو. هاڻي اهو واضح ناهي ته اهي ڪهڙي قسم جا ڪوڊ پوائنٽ آهن. ڪوڊ پوائنٽ جو تصور ظاهر ٿيو ڇاڪاڻ ته جڏهن جاوا ظاهر ٿيو، 16 بٽ (اڌ انٽ) هڪ ڪردار کي انڪوڊ ڪرڻ لاءِ ڪافي هئا. تنهن ڪري، جاوا ۾ چار UTF-16 فارميٽ ۾ نمائندگي ڪئي وئي آهي ("يونيڪوڊ 88" وضاحت). بعد ۾، يونيڪوڊ 2.0 ظاهر ٿيو، جنهن جو تصور هڪ ڪردار جي نمائندگي ڪرڻ لاء هڪ سروگيٽ جوڙو (2 اکر) هو. هي اسان کي ممڪن قدرن جي حد کي وڌائڻ جي اجازت ڏني انٽ ويل تائين. وڌيڪ تفصيلن لاءِ، اسٽيڪ اوور فلو ڏسو: " ڪوڊ پوائنٽ سان چار جو مقابلو ڪرڻ؟ " UTF-16 جو ذڪر پڻ JavaDoc ۾ ڪردار لاءِ ڪيو ويو آهي . اتي، JavaDoc ۾، اهو چيو ويو آهي ته: In this representation, supplementary characters are represented as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the low-surrogates range (\uDC00-\uDFFF). معياري الفابيٽ ۾ هن کي ٻيهر پيدا ڪرڻ ڪافي ڏکيو (۽ شايد ناممڪن به) آهي. پر علامتون اکرن ۽ انگن سان ختم نه ٿيون ٿين. جپان ۾ اهي کڻي آيا آهن ته انڪوڊ ڪرڻ تمام ڏکيو آهي ايموجي - آئيڊيوگرامس ۽ ايموٽڪنز جي ٻولي. وڪيپيڊيا تي ان بابت هڪ دلچسپ مضمون آهي: “ Emoji ”. اچو ته هڪ ايموجي جو مثال ڳولهيون، مثال طور هي: “ ايموجي گھوسٽ ”. جيئن ته اسان ڏسي سگهون ٿا، ساڳيو ڪوڊ پوائنٽ پڻ اتي اشارو ڪيو ويو آهي (قدر = U+1F47B). اهو hexadecimal فارميٽ ۾ ڏيکاريل آهي. جيڪڏهن اسان هڪ ڊيسيمل نمبر ۾ تبديل ڪريون ٿا، اسان کي 128123 ملندو. اهو 16 بٽس کان وڌيڪ آهي (يعني 65535 کان وڌيڪ). اچو ته نقل ڪريون:
جاوا ۾ اسٽرنگ (ڪلاس java.lang.String) - 2
بدقسمتي سان، JavaRush پليٽ فارم متن ۾ اهڙن اکرن کي سپورٽ نٿو ڪري. تنهن ڪري، هيٺ ڏنل مثال ۾ توهان کي اسٽرنگ ۾ قيمت داخل ڪرڻ جي ضرورت پوندي. تنهن ڪري، هاڻي اسان هڪ سادي آزمائش کي سمجھندا سين:
public static void main(String []args){
	    String emojiString = "Вставте сюда эмоджи через ctrl+v";
	    //На один emojiString приходится 2 чара (т.к. не влезает в 16 бит)
	    System.out.println(emojiString.codePoints().count()); //1
	    System.out.println(emojiString.chars().count()); //2
}
جئين توهان ڏسي سگهو ٿا، هن صورت ۾ 1 ڪوڊ پوائنٽ 2 ڪردارن لاءِ وڃي ٿو. هي جادو آهي.

ڪردار

جيئن اسان مٿي ڏٺو، جاوا ۾ اسٽرنگ چار تي مشتمل آهي. هڪ ابتدائي قسم توهان کي قيمت ذخيرو ڪرڻ جي اجازت ڏئي ٿو، پر java.lang.Characterهڪ ابتدائي قسم جي مٿان هڪ لفافي توهان کي هن علامت سان تمام گهڻو مفيد شيون ڪرڻ جي اجازت ڏئي ٿو. مثال طور، اسان هڪ اسٽرنگ کي وڏي ۾ تبديل ڪري سگهون ٿا:
public static void main(String[] args) {
    String line = "организация объединённых наций";
    char[] chars = line.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (i == 0 || chars[i - 1] == ' ') {
            chars[i] = Character.toUpperCase(chars[i]);
        }
    }
    System.out.println(new String(chars));
}
خير، مختلف دلچسپ شيون: isAlphabetic(), isLetter(), isSpaceChar(), isDigit(), isUpperCase(), isMirrored()(مثال طور، بریکٹس. '('هڪ آئيني جي تصوير آهي')').

اسٽرنگ پول

جاوا ۾ اسٽرنگ ناقابل تبديل آهن، يعني مسلسل. اهو پڻ java.lang.String طبقي جي JavaDoc ۾ ظاهر ڪيو ويو آهي . ٻيو، ۽ پڻ تمام ضروري، تارن کي لفظي طور بيان ڪري سگھجي ٿو:
String literalString = "Hello, World!";
String literalString = "Hello, World!";
اهو آهي، ڪو به حوالو ڏنل اسٽرنگ، جيئن مٿي بيان ڪيو ويو آهي، اصل ۾ هڪ اعتراض آهي. ۽ اهو سوال پيدا ڪري ٿو - جيڪڏهن اسان اڪثر تار استعمال ڪندا آهيون ۽ اهي اڪثر ڪري سگهن ٿا ساڳيا (مثال طور، متن "غلطي" يا "ڪاميابي سان")، ڇا اهو پڪ ڪرڻ جو ڪو طريقو آهي ته هر وقت تار نه ٺاهيا ويا آهن؟ رستي جي ذريعي، اسان وٽ اڃا تائين نقشا آهن، جتي ڪنجي هڪ تار ٿي سگهي ٿي. پوءِ اسان کي يقيني طور تي ساڳيون تارون مختلف شيون نه ٿي سگھن ٿيون، ٻي صورت ۾ اسان نقشي مان اعتراض حاصل ڪرڻ جي قابل نه هوندا. جاوا ڊولپرز سوچيو، سوچيو ۽ اسٽرنگ پول سان گڏ آيا. ھي ھڪڙو جڳھ آھي جتي تارون ذخيرو ٿيل آھن، توھان ان کي سڏي سگھوٿا اسٽرنگ ڪيش. نه سڀئي لائينون پاڻ اتي ختم ٿين ٿيون، پر صرف اهي سٽون جيڪي ڪوڊ ۾ بيان ڪيل لفظي ذريعي. توھان پول ۾ ھڪڙو لڪير شامل ڪري سگھو ٿا، پر ان کان پوء وڌيڪ. تنهن ڪري، ياداشت ۾ اسان وٽ هي ڪيش ڪٿي آهي. هڪ منصفانه سوال: هي تلاء ڪٿي آهي؟ ان جو جواب اسٽيڪ اوور فلو تي ملي سگهي ٿو: “ جاوا جو اسٽرنگ مستقل تلاءُ ڪٿي رهندو آهي، هيپ يا اسٽيڪ؟ " اهو Heap ياداشت ۾ واقع آهي، هڪ خاص رن ٽائيم مسلسل تلاء واري علائقي ۾. رن ٽائم مستقل پول مختص ڪيو ويندو آهي جڏهن هڪ ڪلاس يا انٽرفيس ورچوئل مشين ذريعي ميٿڊ ايريا مان ٺاهيو ويندو آهي - هيپ ۾ هڪ خاص علائقو جنهن کي جاوا ورچوئل مشين جي اندر موجود سڀني ٿريڊن تائين رسائي هوندي آهي. اسٽرنگ پول اسان کي ڇا ڏئي ٿو؟ ھن جا ڪيترائي فائدا آھن:
  • ساڳي قسم جون شيون پيدا نه ٿينديون
  • حوالن جي ڀيٽ ۾ برابر جي ذريعي ڪردار جي ڀيٽ ۾ ڪردار جي ڀيٽ ۾ تيز آهي
پر ڇا جيڪڏهن اسان ٺاهيل شئي کي هن ڪيش ۾ رکڻ چاهيون ٿا؟ پوء، اسان وٽ ھڪڙو خاص طريقو آھي: String.intern ھي طريقو اسٽرنگ پول ۾ ھڪڙو اسٽرنگ شامل ڪري ٿو. اهو نوٽ ڪرڻ جي قابل آهي ته اهو صرف هڪ قسم جي ڪيش جي هڪ صف جي صورت ۾ نه آهي (جيئن ته Integers لاء). اندروني طريقي کي "ملي" طور بيان ڪيو ويو آهي. هن جو مطلب آهي ته اهو طريقو پاڻ کي ڪنهن ٻئي ٻوليء ۾ لاڳو ڪيو ويو آهي (اڪثر ڪري C++). بنيادي جاوا طريقن جي صورت ۾، JVM سطح تي مختلف ٻيون اصلاحون لاڳو ڪري سگھجن ٿيون. عام طور تي، جادو هتي ٿيندو. انٽرنيٽ جي باري ۾ هيٺ ڏنل پوسٽ پڙهڻ دلچسپ آهي: https://habr.com/post/79913/#comment_2345814 ۽ اهو هڪ سٺو خيال وانگر لڳي ٿو. پر اهو اسان کي ڪيئن متاثر ڪندو؟ پر اهو واقعي اثر ٿيندو)
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal");
    System.out.println(test == test2);
}
جئين توهان ڏسي سگهو ٿا، لائينون ساڳيون آهن، پر نتيجو غلط ٿيندو. ۽ سڀ ڇاڪاڻ ته == قدر جي لحاظ کان نه، پر حوالي سان. ۽ اهو ڪيئن ڪم ڪري ٿو:
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test == test2);
}
بس نوٽ ڪريو ته اسان اڃا تائين نئين اسٽرنگ ٺاهينداسين. اهو آهي، انٽرنيٽ اسان کي ڪيش مان هڪ اسٽرنگ واپس ڏيندو، پر اصل اسٽرنگ جيڪا اسان ڪيش ۾ ڳوليندا هئاسين، صفائي لاء ٻاهر اڇلائي ويندي، ڇاڪاڻ ته ٻيو ڪوبه هن جي باري ۾ نٿو ڄاڻي. اهو واضح طور تي وسيلن جو هڪ غير ضروري استعمال آهي =( تنهن ڪري، توهان کي هميشه برابر استعمال ڪندي تارن جو مقابلو ڪرڻ گهرجي ته جيئن اوچتو ۽ ممڪن طور تي غلطين کي ڳولڻ ۾ مشڪل کان بچڻ لاء.
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test.equals(test2));
}
Equals هڪ ڪردار جي لحاظ کان اسٽرنگ مقابلي کي انجام ڏئي ٿو.

ڳنڍڻ

جيئن اسان کي ياد آهي، لائنون شامل ڪري سگهجن ٿيون. ۽ جيئن اسان کي ياد آهي، اسان جون تارون ناقابل تبديل آهن. پوء اهو ڪيئن ڪم ڪندو؟ اهو صحيح آهي، هڪ نئين لائين ٺاهي وئي آهي، جنهن ۾ شامل ڪيل شين جي علامتن تي مشتمل آهي. هتي هڪ ملين نسخا آهن ته ڪيئن پلس ڪنٽينشن ڪم ڪري ٿو. ڪن ماڻهن جو خيال آهي ته هر ڀيري ڪا نئين شئي هوندي، ڪن جو خيال آهي ته ڪا ٻي شيءِ هوندي. پر صرف هڪ ماڻهو صحيح ٿي سگهي ٿو. ۽ اهو ڪو ماڻهو آهي javac مرتب ڪندڙ. اچو ته آن لائن ڪمپيلر سروس استعمال ڪريون ۽ هلون:
public class HelloWorld {

    public static void main(String[] args) {
        String helloMessage = "Hello, ";
        String target = "World";
        System.out.println(helloMessage + target);
    }

}
ھاڻي اچو ته ھن کي زپ آرڪائيو طور محفوظ ڪريون، ان کي ڊاريڪٽري ۾ ڪڍون ۽ عمل ڪريو: javap –c HelloWorld ۽ ھتي اسان سڀ ڪجھ ڳوليون ٿا:
جاوا ۾ اسٽرنگ (ڪلاس java.lang.String) - 3
هڪ لوپ ۾، يقينا، اهو بهتر آهي ته ڪنٽينشن کي StringBuilder ذريعي پاڻ کي. ۽ نه ڪنھن جادوءَ جي ڪري، پر انھيءَ ڪري جو StringBuilder ٺھيل آھي چڪر کان اڳ، ۽ چڪر ۾ ئي صرف ضميمو ٿئي ٿو. رستي ۾، هتي هڪ ٻي دلچسپ شيء آهي. هتي هڪ بهترين مضمون آهي: " جاوا ۾ اسٽرنگ پروسيسنگ. حصو I: اسٽرنگ، اسٽرنگ بفر، اسٽرنگ بلڊر ." تبصرن ۾ تمام گهڻي مفيد معلومات. مثال طور، اهو بيان ڪيو ويو آهي ته جڏهن هڪ نظر کي ڳنڍيندي آهي، new StringBuilder().append()...toString()اندروني اصلاح اثر ۾ آهي، -XX:+OptimizeStringConcat آپشن پاران ترتيب ڏنل آهي، جيڪو ڊفالٽ طور تي فعال آهي. اندروني - "اندروني" طور ترجمو ڪيو ويو آهي. JVM اهڙين شين کي هڪ خاص طريقي سان سنڀاليندو آهي، انهن کي اصلي طور تي پروسيس ڪندي، صرف JNI جي اضافي خرچن کان سواءِ. وڌيڪ پڙهو: " HotSpot VM ۾ اندروني طريقا ".

StringBuilder ۽ StringBuffer

جيئن اسان مٿي ڏٺو، StringBuilder هڪ تمام مفيد اوزار آهي. اسٽرنگ ناقابل تبديل آهن، يعني. ناقابل بدل ۽ مان ان کي ٽوڙڻ چاهيان ٿو. تنهن ڪري، اسان کي 2 ڪلاس ڏنا ويا آهن اسان جي مدد ڪرڻ لاء: StringBuilder ۽ StringBuffer. ٻنهي جي وچ ۾ بنيادي فرق اهو آهي ته StringBuffer JDK1.0 ۾ متعارف ڪرايو ويو، جڏهن ته StringBuilder جاوا 1.5 ۾ StringBuffer جي غير هم وقت سازي واري ورزن جي طور تي آيو ته جيئن غير ضروري طريقي سان هم وقت سازي جي وڌندڙ اوور هيڊ کي ختم ڪري سگهجي. اهي ٻئي طبقا تجريدي طبقي جا عمل آهن AbstractStringBuilder - ڪردارن جو هڪ بدلجندڙ سلسلو. چارمز جو هڪ صف اندر ذخيرو ٿيل آهي، جيڪو ضابطي جي مطابق وڌايو ويو آهي: value.length * 2 + 2. ڊفالٽ طور، StringBuilder جي سائيز (ظرفيت) 16 آهي.

نسبتي

تار برابر آهن، يعني. compareTo طريقي کي لاڳو ڪريو. اهو استعمال ڪيو ويندو آهي ڪردار جي لحاظ کان-ڪردار جي مقابلي ۾. دلچسپ ڳالهه اها آهي ته، گهٽ ۾ گهٽ ڊيگهه کي ٻن تارن مان چونڊيو ويو آهي ۽ ان تي هڪ لوپ لڳايو ويو آهي. ان ڪري، compareTo يا ته پھرين بي مثال اکرن جي انٽ ويلز جي وچ ۾ فرق کي واپس ڪندو سڀ کان ننڍي اسٽرنگ جي ڊگھائي تائين، يا واپس ڪندو اسٽرنگ ڊگھائي جي وچ ۾ فرق جيڪڏھن سڀ اکر ملن ٿا گھٽ ۾ گھٽ اسٽرنگ ڊگھائي ۾. ان نسبت کي ”ليڪسيگرافيڪل“ چئبو آهي.

Java Strings سان ڪم ڪرڻ

اسٽرنگ ۾ ڪيترائي مفيد طريقا آھن:
جاوا ۾ اسٽرنگ (ڪلاس java.lang.String) - 4
تارن سان ڪم ڪرڻ لاءِ ڪيترائي ڪم آھن. مثال طور، ڪوڊنگ بيٽ تي . ڪورسرا تي پڻ ھڪڙو ڪورس آھي: " اسٽرنگ تي الگورتھم ".

نتيجو

جيتوڻيڪ هن طبقي جو هڪ مختصر جائزو هڪ شاندار مقدار ۾ جاء وٺندو آهي. ۽ اهو سڀ ڪجهه ناهي. مان JPoint 2015: Alexey Shipilev - Catechism java.lang.String جي رپورٽ کي ڏسڻ جي صلاح ڏيان ٿو.
#وياچسلاو
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION