JavaRush /جاوا بلاگ /Random-SD /جاوا ۽ اسٽرنگ جي مقابلي ۾ برابر - اسٽرنگ جو مقابلو

جاوا ۽ اسٽرنگ جي مقابلي ۾ برابر - اسٽرنگ جو مقابلو

گروپ ۾ شايع ٿيل
سلام! اڄ اسان هڪ انتهائي اهم ۽ دلچسپ موضوع جي باري ۾ ڳالهائينداسين، يعني جاوا ۾ شين جو هڪ ٻئي سان مقابلو ڪرڻ equals() . ۽ درحقيقت، جاوا ۾ ڪھڙين حالتن ۾ آبجیکٹ A برابر ھوندو Object B ؟ برابر ۽ تار جو مقابلو - 1اچو ته هڪ مثال لکڻ جي ڪوشش ڪريون:
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car car1 = new Car();
       car1.model = "Ferrari";
       car1.maxSpeed = 300;

       Car car2 = new Car();
       car2.model = "Ferrari";
       car2.maxSpeed = 300;

       System.out.println(car1 == car2);
   }
}
ڪنسول آئوٽ:

false
ٺيڪ آهي، روڪيو. ڇو، حقيقت ۾، اهي ٻه ڪارٽون برابر نه آهن؟ اسان انهن کي ساڳي ملڪيت ڏني، پر مقابلي جو نتيجو غلط آهي. جواب سادو آهي. آپريٽر ==شين جي ملڪيتن جي مقابلي ۾ نه، پر لنڪس. جيتوڻيڪ ٻن شين ۾ 500 هڪجهڙا خاصيتون آهن، مقابلي جو نتيجو اڃا به غلط هوندو. آخرڪار، لنڪ ٻن مختلف شين ڏانهنcar1 اشارو ڪن ٿا ، ٻن مختلف پتي ڏانهن. ماڻهن جي مقابلي سان صورتحال جو تصور ڪريو. دنيا ۾ شايد ئي ڪو اهڙو ماڻهو هجي جنهن جو نالو، اکين جو رنگ، عمر، قد، وارن جو رنگ وغيره توهان جهڙو هجي. اهو آهي، توهان ڪيترن ئي طريقن سان هڪجهڙائي وارا آهيو، پر اڃا تائين توهان جڙيل نه آهيو، ۽ خاص طور تي ساڳيو ماڻهو ناهي. آپريٽر لڳ ڀڳ ساڳيو منطق لاڳو ٿئي ٿو جڏهن اسان ان کي استعمال ڪريون ٿا ٻن شين جي مقابلي لاءِ. پر ڇا جيڪڏھن توھان کي توھان جي پروگرام ۾ مختلف منطق جي ضرورت آھي؟ مثال طور، جيڪڏهن توهان جو پروگرام ڊي اين اي تجزيو کي نقل ڪري ٿو. هن کي ٻن ماڻهن جي ڊي اين اي ڪوڊ جو مقابلو ڪرڻ گهرجي ۽ اهو طئي ڪرڻ گهرجي ته اهي جڙيل آهن. car2 برابر ۽ تار جو مقابلو - 2==
public class Man {

   int dnaCode;

   public static void main(String[] args) {

       Man man1 = new Man();
       man1.dnaCode = 1111222233;

       Man man2 = new Man();
       man2.dnaCode = 1111222233;

       System.out.println(man1 == man2);
   }
}
ڪنسول آئوٽ:

false
اهو منطقي آهي ته نتيجو ساڳيو هو (سڀني کان پوء، اسان ڪجھ به تبديل نه ڪيو)، پر هاڻي اسان ان سان خوش نه آهيون! درحقيقت، حقيقي زندگي ۾، ڊي اين اي تجزيي هڪ سئو سيڪڙو ضمانت آهي ته اسان جڙيل ٻارن کي منهن ڏئي رهيا آهيون. پر اسان جو پروگرام ۽ آپريٽر ==اسان کي ٻي صورت ۾ ٻڌايو. اسان ڪيئن هن رويي کي تبديل ڪري سگهون ٿا ۽ يقيني بڻائي سگهون ٿا ته جيڪڏهن ڊي اين اي ٽيسٽ سان ملن ٿا، پروگرام صحيح نتيجو پيدا ڪندو؟ ھن مقصد لاء، ھڪڙو خاص طريقو ٺاھيو ويو Java - equals() .

برابر () جاوا ۾ طريقو

جيئن ته طريقي سان toString()اسان اڳ ۾ بحث ڪيو آهي، برابر () طبقي سان تعلق رکي ٿو، Objectجاوا ۾ سڀ کان اهم طبقو، جنهن مان ٻيا سڀئي طبقا نڪتل آهن. بهرحال، equals() خود اسان جي پروگرام جي رويي کي ڪنهن به طريقي سان تبديل نه ڪندو:
public class Man {

   String dnaCode;

   public static void main(String[] args) {

       Man man1 = new Man();
       man1.dnaCode = "111122223333";

       Man man2 = new Man();
       man2.dnaCode = "111122223333";

       System.out.println(man1.equals(man2));
   }
}
ڪنسول آئوٽ:

false
بلڪل ساڳيو نتيجو، پوءِ هن طريقي جي ضرورت ڇو آهي؟ :/ اهو سادو آهي. حقيقت اها آهي ته هاڻي اسان اهو طريقو استعمال ڪيو آهي جيئن اهو ڪلاس ۾ لاڳو ٿئي ٿو Object. ۽ جيڪڏهن اسان ڪلاس ڪوڊ ۾ وڃون ٿا Object۽ ڏسو ته اهو طريقو ان ۾ ڪيئن لاڳو ٿئي ٿو ۽ اهو ڇا ڪري ٿو، اسان ڏسنداسين:
public boolean equals(Object obj) {
   return (this == obj);
}
اهو ئي سبب آهي جو اسان جي پروگرام جي رويي ۾ تبديلي نه آئي آهي! ڪلاس جي اندر برابر () طريقو Objectساڳيو حوالو مقابلو آهي، ==. پر هن طريقي جي چال اها آهي ته اسان ان کي ختم ڪري سگهون ٿا. اوور رائيڊنگ جو مطلب آهي اسان جي ڪلاس ۾ پنهنجو برابر () طريقو لکڻ Man۽ ان کي ائين ڪرڻ جيئن اسان چاهيون ٿا! هاڻي اسان مطمئن نه آهيون ته چيڪ man1.equals(man2)لازمي طور تي ساڳيو ڪم ڪري ٿو man1 == man2. هتي اهو آهي ته اسان هن صورتحال ۾ ڇا ڪنداسين:
public class Man {

   int dnaCode;

   public boolean equals(Man man) {
       return this.dnaCode ==  man.dnaCode;
   }

   public static void main(String[] args) {

       Man man1 = new Man();
       man1.dnaCode = 1111222233;

       Man man2 = new Man();
       man2.dnaCode = 1111222233;

       System.out.println(man1.equals(man2));

   }
}
ڪنسول آئوٽ:

true
هڪ مڪمل طور تي مختلف نتيجو! معياري هڪ جي بدران اسان جي پنهنجي برابر () طريقي سان لکڻ سان، اسان صحيح رويي کي حاصل ڪيو: هاڻي جيڪڏهن ٻن ماڻهن جو ڊي اين اي ڪوڊ ساڳيو آهي، پروگرام اسان کي ٻڌائي ٿو: "ڊي اين اي تجزيي ڏيکاري ٿي ته اهي جڙيل آهن" ۽ واپسي صحيح آهي! توهان جي ڪلاسن ۾ equals() طريقي کي ختم ڪندي، توهان آساني سان ٺاهي سگهو ٿا ضروري اعتراض جي مقابلي واري منطق. اسان صرف عام اصطلاحن ۾ شين جي مقابلي تي ڌيان ڏنو آهي. اسان وٽ اڃا به اڳتي هن موضوع تي هڪ الڳ وڏو ليڪچر هوندو (توهان ان کي جلدي پڙهي سگهو ٿا، جيڪڏهن توهان دلچسپي رکو ٿا).

جاوا ۾ String compare - String comparison

ڇو اسان هر شيءِ کان ڌار ڌار اسٽرنگ موازن جو علاج ڪندا آهيون؟ يقينن، حقيقت ۾، پروگرامنگ ۾ لائين هڪ مڪمل مختلف ڪهاڻي آهي. پهرين، جيڪڏهن توهان سڀني جاوا پروگرامن کي وٺو جيڪي انسانن پاران لکيل آهن، انهن ۾ اٽڪل 25٪ شيون انهن مان ٺهيل آهن. تنهن ڪري، هي موضوع تمام اهم آهي. ٻيو، تارن جي ڀيٽ ڪرڻ جو عمل حقيقت ۾ ٻين شين کان بلڪل مختلف آهي. اچو ته هڪ سادي مثال ڏسو:
public class Main {

   public static void main(String[] args) {

       String s1 = "JavaRush is the best site to learn Java!";
       String s2 = new String("JavaRush is the best site to learn Java!");
       System.out.println(s1 == s2);
   }
}
ڪنسول آئوٽ:

false
پر ڪوڙ ڇو؟ سٽون بلڪل ساڳيون آهن، لفظ لاء لفظ :/ توهان فرض ڪري سگهو ٿا: اهو آهي ڇو ته آپريٽر == حوالن جي ڀيٽ ڪري ٿو! سڀ کان پوء، s1اهي s2ياداشت ۾ مختلف پتا آهن. جيڪڏهن اهو خيال توهان کي محسوس ٿيو ته پوءِ اچو ته اسان جو مثال ٻيهر ڏيون:
public class Main {

   public static void main(String[] args) {

       String s1 = "JavaRush is the best site to learn Java!";
       String s2 = "JavaRush is the best site to learn Java!";
       System.out.println(s1 == s2);
   }
}
هاڻي اسان وٽ پڻ ٻه لنڪ آهن، پر نتيجو بدلجي ويو آهي سامهون: ڪنسول آئوٽ:

true
مڪمل طور تي پريشان؟ :) اچو ته ان کي ڪڍي. آپريٽر ==اصل ۾ ميموري ۾ پتي جي ڀيٽ ڪري ٿو. هي قاعدو هميشه ڪم ڪري ٿو ۽ ان ۾ شڪ ڪرڻ جي ڪا ضرورت ناهي. هن جو مطلب اهو آهي ته جيڪڏهن s1 == s2اهو صحيح آهي، انهن ٻن تارن کي ميموري ۾ ساڳيو پتو آهي. ۽ حقيقت ۾ اهو آهي! اهو وقت اچي ويو آهي هڪ خاص ميموري ايريا سان واقف ٿيڻ جو اسٽرنگ کي محفوظ ڪرڻ لاءِ - اسٽرنگ پول ( String pool) برابر ۽ تار جو مقابلو - 3اسٽرنگ پول اهو علائقو آهي جيڪو توهان جي پروگرام ۾ ٺاهيل سڀني اسٽرنگ قدرن کي محفوظ ڪرڻ لاءِ. اھو ڇا لاءِ ٺاھيو ويو؟ جيئن اڳ ذڪر ڪيو ويو آهي، تار سڀني شين جو هڪ وڏو حصو وٺن ٿا. ڪنهن به وڏي پروگرام ۾ تمام گهڻيون لائينون ٺاهيون وينديون آهن. ميموري کي بچائڻ لاءِ، اهو ئي ضروري آهي String Pool- متن سان هڪ لڪير جيڪا توهان کي گهربل هجي اتي رکيل آهي، ۽ مستقبل ۾، نوان ٺاهيل لنڪس ساڳئي ميموري واري علائقي ڏانهن اشارو ڪن ٿا، هر وقت اضافي ياداشت مختص ڪرڻ جي ضرورت ناهي. هر دفعي جڏهن توهان لکندا آهيو String = “........”، پروگرام چيڪ ڪري ٿو ته ڇا سٹرنگ پول ۾ اهڙي متن سان هڪ قطار آهي. جيڪڏهن اتي آهي، هڪ نئون پيدا نه ٿيندو. ۽ نئين لنڪ سٽرنگ پول ۾ ساڳئي ايڊريس ڏانهن اشارو ڪندي جتي هي اسٽرنگ محفوظ ٿيل آهي. تنهن ڪري، جڏهن اسان پروگرام ۾ لکيو
String s1 = "JavaRush is the best site to learn Java!";
String s2 = "JavaRush is the best site to learn Java!";
لنڪ s2بلڪل ساڳي جڳهه ڏانهن اشارو ڪري ٿو s1. پهرين ڪمانڊ اسٽرنگ پول ۾ هڪ نئين لائن ٺاهي جيڪا اسان کي گهربل متن سان، ۽ جڏهن اها ٻي ڳالهه تي آئي، اهو صرف ساڳئي ميموري واري علائقي ڏانهن اشارو ڪيو ويو آهي s1. توهان ساڳئي متن سان گهٽ ۾ گهٽ 500 وڌيڪ لائينون ٺاهي سگهو ٿا، نتيجو تبديل نه ٿيندو. روڪ. پر پوءِ اهو مثال اسان لاءِ اڳي ڇو نه ڪم آيو؟
public class Main {

   public static void main(String[] args) {

       String s1 = "JavaRush is the best site to learn Java!";
       String s2 = new String("JavaRush is the best site to learn Java!");
       System.out.println(s1 == s2);
   }
}
مان سمجهان ٿو، سمجهه ۾، توهان اڳ ۾ ئي اندازو لڳايو ته سبب ڇا آهي :) وڌيڪ پڙهڻ کان اڳ اندازو لڳائڻ جي ڪوشش ڪريو. توهان ڏسي سگهو ٿا ته اهي ٻه سٽون مختلف ٺاهيا ويا آهن. هڪ آپريٽر جي مدد سان آهي new، ۽ ٻيو ان کان سواء آهي. اهو ئي سبب آهي. نئون آپريٽر، جڏهن هڪ اعتراض ٺاهي، زبردستي ان لاءِ ميموري ۾ هڪ نئون علائقو مختص ڪري ٿو . ۽ لڪير سان ٺهيل آهي new، ان ۾ ختم نه ٿيندي آهي String Pool: اهو هڪ الڳ شئي بڻجي ويندو آهي، جيتوڻيڪ ان جو متن بلڪل ساڳيو ئي ساڳيو لڪير String Pool'a' سان. اهو آهي، جيڪڏهن اسان هيٺ ڏنل ڪوڊ لکون ٿا:
public class Main {

   public static void main(String[] args) {

       String s1 = "JavaRush is the best site to learn Java!";
       String s2 = "JavaRush is the best site to learn Java!";
       String s3 = new String("JavaRush is the best site to learn Java!");
   }
}
ياداشت ۾ اهو هن طرح نظر ايندو: برابر ۽ تار جو مقابلو - 4۽ هر دفعي هڪ نئين شئي ٺاهي ويندي، newياداشت ۾ هڪ نئون علائقو مختص ڪيو ويندو، جيتوڻيڪ نئين لائين اندر متن ساڳيو آهي! اسان لڳي ٿو آپريٽر کي ترتيب ڏنو آهي ==، پر ڇا اسان جي نئين دوست بابت - برابر () طريقو؟
public class Main {

   public static void main(String[] args) {

       String s1 = "JavaRush is the best site to learn Java!";
       String s2 = new String("JavaRush is the best site to learn Java!");
       System.out.println(s1.equals(s2));
   }
}
ڪنسول آئوٽ:

true
دلچسپ. اسان ڄاڻون ٿا ته ڇا آهي s1۽ s2ياداشت ۾ مختلف علائقن ڏانهن اشارو آهي. پر، ان جي باوجود، برابر () طريقو چوي ٿو ته اهي برابر آهن. ڇو؟ ياد رکو، مٿي اسان چيو آهي ته برابر () طريقو توهان جي ڪلاس ۾ ختم ٿي سگهي ٿو ته جيئن اهو شيون توهان کي گهربل طريقي سان مقابلو ڪري؟ اھو اھو آھي جيڪو انھن ڪلاس سان ڪيو String. ان ۾ هڪ اوور رائڊ برابر () طريقو آهي. ۽ اهو ڳنڍڻ جو مقابلو نه ڪندو آهي، بلڪه تارن ۾ ڪردارن جي ترتيب سان. ۽ جيڪڏهن متن ۾ متن ساڳيو آهي، اهو مسئلو ناهي ته اهي ڪيئن ٺاهيا ويا آهن ۽ اهي ڪٿي ذخيرو ٿيل آهن: اسٽرنگ پول ۾، يا هڪ الڳ ياداشت واري علائقي ۾. مقابلي جو نتيجو صحيح ٿيندو. رستي جي ذريعي، جاوا توهان کي اجازت ڏئي ٿو صحيح طور تي تارن جي مقابلي ۾ غير حساس انداز ۾. عام حالت ۾، جيڪڏهن توهان هڪ لڪير لکندا آهيو، مثال طور، ڪيپ ۾، مقابلي جو نتيجو غلط ٿيندو:
public class Main {

   public static void main(String[] args) {

       String s1 = "JavaRush is the best site to learn Java!";
       String s2 = new String("JAVARUSH - ЛУЧШИЙ САЙТ ДЛЯ ИЗУЧЕНИЯ JAVA!");
       System.out.println(s1.equals(s2));
   }
}
ڪنسول آئوٽ:

false
هن معاملي لاء، طبقي Stringوٽ هڪ طريقو آهي equalsIgnoreCase(). جيڪڏهن توهان جي مقابلي ۾ بنيادي شيء مخصوص ڪردارن جي ترتيب آهي، ۽ انهن جي صورت ۾ نه، توهان ان کي استعمال ڪري سگهو ٿا. مثال طور، هي ڪارائتو ٿيندو جڏهن ٻن اي ميل پتي جي مقابلي ۾:
public class Main {

   public static void main(String[] args) {

       String address1 = "Moscow, Academician Korolev street, 12";
       String address2 = new String("Г. МОСКВА, УЛ. АКАДЕМИКА КОРОЛЕВА, ДОМ 12");
       System.out.println(address1.equalsIgnoreCase(address2));
   }
}
انهي صورت ۾، اهو ظاهر آهي ته اسان ساڳئي پتي بابت ڳالهائي رهيا آهيون، تنهنڪري طريقو استعمال ڪندي equalsIgnoreCase()صحيح فيصلو ٿيندو.

String.intern() طريقو

ڪلاس String۾ هڪ ٻيو مشڪل طريقو آهي - intern()؛ طريقو intern()سڌو ڪم ڪري ٿو String Pool'om' سان. جيڪڏهن توهان intern()اسٽرنگ تي هڪ طريقو سڏين ٿا، اهو:
  • ڏسڻ ۾ اچي ٿو ته ڇا اسٽرنگ پول ۾ ھن متن سان گڏ ھڪڙو تار آھي
  • جيڪڏهن اتي آهي، ان کي تلاء ۾ هڪ لنڪ موٽائي
  • جيڪڏھن نه، اھو ھن متن سان ھڪڙي لڪير کي اسٽرنگ پول ۾ رکي ٿو ۽ ان کي ھڪڙي لنڪ موٽائي ٿو.
نئين ذريعي ٺاهيل اسٽرنگ ريفرنس تي طريقي کي لاڳو ڪرڻ سان ، اسان ان کي 'a' ذريعي intern()اسٽرنگ ريفرنس سان ڀيٽ ڪري سگھون ٿا . String Pool==
public class Main {

   public static void main(String[] args) {

       String s1 = "JavaRush is the best site to learn Java!";
       String s2 = new String("JavaRush is the best site to learn Java!");
       System.out.println(s1 == s2.intern());
   }
}
ڪنسول آئوٽ:

true
اڳي، جڏهن اسان انهن جي مقابلي ۾ بغير intern()، نتيجو غلط هو. ھاڻي طريقي جي intern()چڪاس ڪئي وئي ته ڇا متن سان ھڪڙي لائن ھئي "جاوا رش - جاوا سکڻ لاءِ بھترين سائيٽ!" تار جي تلاء ۾. يقينا اهو اتي آهي: اسان ان کي پيدا ڪيو جڏهن اسان لکيو
String s1 = "JavaRush is the best site to learn Java!";
اهو چيڪ ڪيو ويو ته ريفرنس s1۽ ريفرنس ذريعي موٽايل طريقي سان s2.intern()ميموري ۾ ساڳئي علائقي ڏانهن اشارو ڪيو ويو آهي، ۽، يقينا، اهي ڪندا آهن :) اختصار ڪرڻ، ياد رکڻ ۽ استعمال ڪرڻ لاء بنيادي قاعدو: تارن جي مقابلي ڪرڻ لاء، هميشه استعمال ڪريو برابر () طريقو! جڏهن تارن جي مقابلي ۾، توهان تقريبن هميشه انهن جي متن جي ڀيٽ ڪرڻ جو مطلب آهي، نه لنڪ، ياداشت جي علائقن، وغيره. equals() طريقو اهو ئي ڪري ٿو جيڪو توهان کي گهربل آهي. هتي ڪجهه لنڪ آهن توهان لاءِ پنهنجو پاڻ پڙهائڻ لاءِ:
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION