CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ String ۽ Equals جو مقابلو ڪريو
John Squirrels
سطح
San Francisco

جاوا ۾ String ۽ Equals جو مقابلو ڪريو

گروپ ۾ شايع ٿيل
سلام اڄ اسان هڪ انتهائي اهم ۽ دلچسپ موضوع تي ڳالهائينداسين، يعني شين جي شين سان موازنہ ڪرڻ (Compare Strings and Equals). تنهن ڪري جاوا ۾، جڏهن اعتراض اي اعتراض بي جي برابر هوندو ؟ اچو ته هڪ مثال لکڻ جي ڪوشش ڪريون:
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);
   }
}
ڪنسول آئوٽ: غلط انتظار ڪريو، روڪيو. اهو ڇو آهي ته اهي ٻئي ڪارٽون برابر نه آهن؟ اسان انهن کي ساڳيون ملڪيتون ڏنيون آهن، پر مقابلي جو نتيجو غلط آهي. جواب سادو آهي. == آپريٽر اعتراض جي حوالن جو مقابلو ڪري ٿو، نه اعتراض جي ملڪيت. ٻه شيون هڪجهڙائي سان 500 شعبا به ٿي سگهن ٿيون، پر انهن جو مقابلو ڪرڻ سان اڃا به غلط ثابت ٿيندو. آخرڪار، حوالو ڪار1 ۽ ڪار 2 ٻن مختلف شين ڏانهن اشارو ڪن ٿا، يعني ٻن مختلف پتي ڏانهن. تصور ڪريو ھڪڙي صورتحال جتي توھان ماڻھن جي مقابلي ڪري رھيا آھيو. يقيناً، دنيا ۾ ڪٿي ڪو اهڙو ماڻهو آهي جيڪو توهان جو ساڳيو نالو، اکين جو رنگ، عمر، قد، وارن جو رنگ وغيره شيئر ڪري ٿو. اهو توهان کي ڪيترن ئي معاملن ۾ هڪ جهڙو بڻائي ٿو، پر توهان اڃا تائين جاڙا نه آهيو - ۽ توهان ظاهري طور تي نه آهيو. ساڳيو ماڻهو.
برابر ۽ اسٽرنگ موازن - 2
== آپريٽر لڳ ڀڳ اهو ساڳيو منطق استعمال ڪري ٿو جڏهن اسان ان کي استعمال ڪريون ٿا ٻن شين جي مقابلي لاءِ . پر ڇا جيڪڏھن توھان کي ضرورت آھي توھان جي پروگرام کي مختلف منطق استعمال ڪرڻ لاءِ؟ مثال طور، فرض ڪريو توھان جو پروگرام ڊي اين اي تجزيو انجام ڏئي ٿو. اهو ٻن ماڻهن جي جينياتي ڪوڊ جو مقابلو ڪري ٿو، ۽ اهو طئي ڪري ٿو ته ڇا اهي جاڙا آهن.
public class Man {

   int geneticCode;

   public static void main(String[] args) {

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

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

       System.out.println(man1 == man2);
   }
}
ڪنسول آئوٽ: غلط اسان کي ساڳيو منطقي نتيجو ملي ٿو (ڇاڪاڻ ته اسان گهڻو تبديل نه ڪيو آهي)، پر هاڻي اهو منطق سٺو ناهي! آخرڪار، حقيقي زندگي ۾، ڊي اين اي تجزيو اسان کي 100٪ گارنٽي ڏيڻ گهرجي ته اسان جي سامهون جاڙا بيٺا آهن. پر اسان جو پروگرام ۽ == آپريٽر اسان کي ان جي ابتڙ ٻڌائي ٿو. اسان هن رويي کي ڪيئن تبديل ڪريون ٿا ۽ پڪ ڪريون ٿا ته پروگرام صحيح نتيجو ڪڍي ٿو جڏهن ڊي اين اي سان ملندو؟ جاوا هن لاءِ هڪ خاص طريقو آهي: equals() . جيئن ته toString() طريقو، جنهن تي اسان اڳ ۾ بحث ڪيو آهي، equals() جو تعلق Object ڪلاس سان آهي- جاوا ۾ سڀ کان اهم ڪلاس، اهو طبقو جنهن مان ٻيا سڀئي طبقا نڪرندا آهن. پر equals() اسان جي پروگرام جي رويي کي پاڻ ۾ تبديل نٿو ڪري:
public class Man {

   String geneticCode;

   public static void main(String[] args) {

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

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

       System.out.println(man1.equals(man2));
   }
}
ڪنسول آئوٽ: غلط بلڪل ساڳيو نتيجو، پوء اسان کي هن طريقي جي ڪهڙي ضرورت آهي؟ :/ اهو تمام سادو آهي. هتي مسئلو اهو آهي ته اسان هن وقت هن طريقي کي استعمال ڪري رهيا آهيون جيئن اهو اعتراض ڪلاس ۾ لاڳو ٿئي ٿو. ۽ جيڪڏهن اسان اعتراض ڪلاس جي ڪوڊ ۾ وڃون ٿا ۽ طريقي جي عمل کي ڏسو، هي اهو آهي جيڪو اسان ڏسنداسين:
public boolean equals(Object obj) {
   return (this == obj);
}
اهو ئي سبب آهي جو پروگرام جو رويو تبديل نه ٿيو آهي! بلڪل ساڳيو == آپريٽر (جيڪو حوالن جو مقابلو ڪري ٿو) استعمال ڪيو ويندو آهي equals() طريقي جي اندر Object class. پر هن طريقي سان چال اها آهي ته اسان ان کي ختم ڪري سگهون ٿا. اوور رائڊ ڪرڻ جو مطلب آهي پنهنجو برابر () طريقو لکڻ اسان جي انسان طبقي ۾، اهو رويو ڏيو جيڪو اسان کي گهربل آهي! في الحال، اسان ان حقيقت کي پسند نٿا ڪريون ته 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));

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

جاوا ۾ تارن جي ڀيٽ ڪرڻ

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

   public static void main(String[] args) {

       String s1 = "CodeGym is the best website for learning Java!";
       String s2 = new String("CodeGym is the best website for learning Java!");
       System.out.println(s1 == s2);
   }
}
ڪنسول آئوٽ: غلط پر اسان کي غلط ڇو مليو؟ سڀ کان پوء، تار بلڪل ساڳيا آهن، لفظ لاء لفظ :/ توهان شايد اهو اندازو لڳايو هوندو: اهو ان ڪري آهي ته == آپريٽر حوالن جي مقابلي ۾ ! واضح طور تي، s1 ۽ s2 ميموري ۾ مختلف پتا آهن. جيڪڏهن توهان سوچيو ته، پوء اچو ته اسان جي مثال کي ٻيهر ڪم ڪريو:
public class Main {

   public static void main(String[] args) {

       String s1 = "CodeGym is the best website for learning Java!";
       String s2 = "CodeGym is the best website for learning Java!";
       System.out.println(s1 == s2);
   }
}
هاڻي اسان وٽ ٻه حوالا آهن، پر نتيجو بلڪل سامهون آهي: ڪنسول آئوٽ: سچي مدد سان پريشان؟ اچو ته سمجهون ته ڇا ٿي رهيو آهي. == آپريٽر واقعي ميموري ايڊريس جو مقابلو ڪري ٿو. اهو هميشه سچ آهي ۽ توهان کي ان تي شڪ ڪرڻ جي ضرورت ناهي. ان جو مطلب اهو آهي ته جيڪڏهن s1 == s2 صحيح موٽائي، پوء انهن ٻن تارن جو ساڳيو پتو آهي. ۽ واقعي هي سچ آهي! اھو وقت آھي توھان کي متعارف ڪرائڻ لاءِ ميموري جي ھڪڙي خاص علائقي لاءِ اسٽرنگ کي محفوظ ڪرڻ لاءِ: اسٽرنگ پول
برابر ۽ اسٽرنگ موازنہ - 3
اسٽرنگ پول ھڪڙو علائقو آھي جيڪو توھان جي پروگرام ۾ ٺاھيو سڀني اسٽرنگ قدرن کي محفوظ ڪرڻ لاءِ. اهو ڇو پيدا ڪيو ويو؟ جيئن اسان اڳ ۾ چيو آهي، تار سڀني شين جو هڪ وڏو سيڪڙو نمائندگي ڪن ٿا. ڪو به وڏو پروگرام ڪيترائي تار ٺاهي ٿو. ميموري کي بچائڻ لاءِ اسٽرنگ پول ٺاهيو ويو: تارون اتي رکيا ويندا آهن ۽ پوءِ ٺاهيل اسٽرنگ ميموري جي ساڳئي علائقي ڏانهن اشارو ڪندا آهن- هر دفعي اضافي ميموري مختص ڪرڻ جي ضرورت ناهي. هر دفعي جڏهن توهان لکندا آهيو String = "........" پروگرام چيڪ ڪري ٿو ته ڇا اسٽرنگ پول ۾ هڪجهڙائي واري اسٽرنگ آهي. جيڪڏهن اتي آهي، ته پوء هڪ نئون اسٽرنگ پيدا نه ٿيندو. ۽ نئون حوالو سٽرنگ پول ۾ ساڳي ايڊريس ڏانهن اشارو ڪندو (جتي هڪجهڙائي واري اسٽرنگ واقع آهي). پوء جڏهن اسان لکيو
String s1 = "CodeGym is the best website for learning Java!";
String s2 = "CodeGym is the best website for learning Java!";
s2 ساڳي جڳهه ڏانهن اشارو ڪري ٿو s1 . پهريون بيان اسٽرنگ پول ۾ نئين اسٽرنگ ٺاهي ٿو. ٻيو بيان صرف ميموري جي ساڳئي علائقي ڏانهن اشارو ڪري ٿو s1 . توھان ڪري سگھوٿا ٻيون 500 ساڳيا تارون ۽ نتيجو تبديل نه ٿيندو. هڪ منٽ ترسو. جيڪڏهن اهو سچ آهي ته پوءِ اهو مثال اڳي ڇو نه ڪم آيو؟
public class Main {

   public static void main(String[] args) {

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

   public static void main(String[] args) {

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

   public static void main(String[] args) {

       String s1 = "CodeGym is the best website for learning Java!";
       String s2 = new String("CodeGym is the best website for learning Java!");
       System.out.println(s1.equals(s2));
   }
}
ڪنسول آئوٽ: سچي دلچسپ. اسان کي پڪ آهي ته s1 ۽ s2 ميموري ۾ مختلف علائقن ڏانهن اشارو آهي. پر برابر () طريقو اڃا تائين اسان کي ٻڌائي ٿو ته اهي برابر آهن. ڇو؟ ياد رکو اسان اڳ ۾ چيو آهي ته برابر () طريقي کي ختم ڪري سگهجي ٿو شين جي مقابلي لاءِ جڏهن ته اسان چاهيون ٿا؟ بس اهو ئي آهي جيڪو هنن String طبقي سان ڪيو آهي. اهو برابر () طريقي کي ختم ڪري ٿو. ۽ حوالن جي ڀيٽ ڪرڻ جي بدران، اهو تارن ۾ ڪردارن جي ترتيب جو مقابلو ڪري ٿو. جيڪڏهن متن ساڳيو آهي، ته پوءِ ان سان ڪو فرق نٿو پوي ته اهي ڪيئن ٺاهيا ويا يا ڪٿي اهي ذخيرو ٿيل آهن: ڇا اسٽرنگ پول ۾ يا ياداشت جي الڳ حصي ۾. مقابلي جو نتيجو صحيح ٿيندو. رستي جي ذريعي، جاوا توهان کي غير حساس اسٽرنگ موازن کي انجام ڏيڻ جي اجازت ڏئي ٿي. عام طور تي، جيڪڏهن تارن مان هڪ ۾ سڀ وڏا اکر آهن، ته پوءِ مقابلي جو نتيجو غلط ٿيندو:
public class Main {

   public static void main(String[] args) {

       String s1 = "CodeGym is the best website for learning Java!";
       String s2 = new String("CODEGYM IS THE BEST WEBSITE FOR LEARNING JAVA!");
       System.out.println(s1.equals(s2));
   }
}
ڪنسول آئوٽ پٽ: غلط ڪيس جي غير حساس موازن لاءِ، اسٽرنگ ڪلاس وٽ آهي equalsIgnoreCase() طريقو. توهان ان کي استعمال ڪري سگهو ٿا جيڪڏهن توهان صرف مخصوص اکرن جي ترتيب جي مقابلي جي باري ۾ خيال رکون ٿا بلڪه خط جي صورت ۾. مثال طور، هي مددگار ٿي سگهي ٿو جڏهن ٻن پتي جي مقابلي ۾:
public class Main {

   public static void main(String[] args) {

       String address1 = "2311 Broadway Street, San Francisco";
       String address2 = new String("2311 BROADWAY STREET, SAN FRANCISCO");
       System.out.println(address1.equalsIgnoreCase(address2));
   }
}
انهي صورت ۾، اسان واضح طور تي ساڳئي پتي بابت ڳالهائي رهيا آهيون، تنهنڪري اهو سمجھندو آهي ته استعمال ڪرڻ جو مطلب آهي equalsIgnoreCase() طريقو.

String.intern() طريقو

اسٽرنگ ڪلاس ۾ ھڪڙو وڌيڪ مشڪل طريقو آھي: intern() ؛ intern () طريقو سڌو سنئون اسٽرنگ پول سان ڪم ڪري ٿو. جيڪڏهن توهان intern() طريقي کي ڪجهه اسٽرنگ تي سڏين ٿا:
  • اهو چيڪ ڪري ٿو ته ڇا اسٽرنگ پول ۾ هڪ ملندڙ اسٽرنگ آهي
  • جيڪڏهن اتي آهي، اهو پول ۾ اسٽرنگ جو حوالو ڏئي ٿو
  • جيڪڏهن نه، اهو اسٽرنگ پول ۾ شامل ڪري ٿو ۽ ان ڏانهن هڪ حوالو واپس ڪري ٿو.
نئين استعمال ڪندي حاصل ڪيل اسٽرنگ ريفرنس تي intern() طريقو استعمال ڪرڻ کان پوءِ ، اسان استعمال ڪري سگھون ٿا == آپريٽر ان کي اسٽرنگ پول مان اسٽرنگ ريفرنس سان ڀيٽڻ لاءِ.
public class Main {

   public static void main(String[] args) {

       String s1 = "CodeGym is the best website for learning Java!";
       String s2 = new String("CodeGym is the best website for learning Java!");
       System.out.println(s1 == s2.intern());
   }
}
ڪنسول آئوٽ: صحيح جڏهن اسان انهن تارن جو مقابلو ڪيو اڳي کان سواءِ intern() ، نتيجو غلط هو. هاڻي intern() طريقو چيڪ ڪري ٿو ته ڇا اسٽرنگ "CodeGym جاوا سکڻ لاءِ بهترين سائيٽ آهي!" اسٽرنگ پول ۾ آهي. يقينا، اهو آهي: اسان ان سان ٺاهيو
String s1 = "CodeGym is the best website for learning Java!";
اسان چيڪ ڪريون ٿا ته ڇا s1 ۽ حوالو s2.intern() ذريعي موٽايو ويو ياداشت جي ساڳئي علائقي ڏانهن اشارو. ۽ يقينن، اهي ڪندا آهن :) خلاصو، ياد ڪريو ۽ هن اهم قاعدي کي لاڳو ڪريو: هميشه استعمال ڪريو equals() طريقو تارن جو مقابلو ڪرڻ لاءِ! جڏهن تارن جي مقابلي ۾، اسان تقريبن هميشه انهن جي ڪردارن جي مقابلي ڪرڻ جو مطلب حوالن، ياداشت جي علائقن، يا ڪنهن ٻئي جي ڀيٽ ۾. equals () طريقو اهو ئي ڪري ٿو جيڪو توهان کي گهربل آهي. جيڪو توهان سکيو ان کي مضبوط ڪرڻ لاءِ، اسان توهان کي اسان جي جاوا ڪورس مان هڪ وڊيو سبق ڏسڻ جي صلاح ڏيون ٿا
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION