JavaRush /جاوا بلاگ /Random-UR /جاوا اور سٹرنگ موازنہ میں برابر ہے - سٹرنگ موازنہ

جاوا اور سٹرنگ موازنہ میں برابر ہے - سٹرنگ موازنہ

گروپ میں شائع ہوا۔
ہیلو! آج ہم ایک بہت اہم اور دلچسپ موضوع کے بارے میں بات کریں گے، یعنی جاوا میں اشیاء کا ایک دوسرے سے موازنہ کرنا equals() ۔ اور درحقیقت، جاوا میں کن صورتوں میں آبجیکٹ اے آبجیکٹ بی کے برابر ہوگا ؟ مساوی اور تار کا موازنہ - 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
یہ منطقی ہے کہ نتیجہ ایک ہی تھا (آخر کار، ہم نے کچھ بھی نہیں بدلا)، لیکن اب ہم اس سے خوش نہیں ہیں! درحقیقت، حقیقی زندگی میں، ڈی این اے کا تجزیہ اس بات کی سو فیصد ضمانت ہے کہ ہم جڑواں بچوں کا سامنا کر رہے ہیں۔ لیکن ہمارا پروگرام اور آپریٹر ==ہمیں دوسری صورت میں بتاتے ہیں۔ ہم اس رویے کو کیسے بدل سکتے ہیں اور اس بات کو یقینی بنا سکتے ہیں کہ اگر ڈی این اے ٹیسٹ میچ کرتے ہیں، تو پروگرام درست نتیجہ دے گا؟ اس مقصد کے لیے جاوا میں ایک خاص طریقہ بنایا گیا تھا - equals() ۔

جاوا میں 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
ایک بالکل مختلف نتیجہ! معیاری کی بجائے اپنا اپنا مساوی () طریقہ لکھ کر، ہم نے درست رویہ حاصل کیا: اب اگر دو لوگوں کا ڈی این اے کوڈ ایک ہی ہے، تو پروگرام ہمیں بتاتا ہے: "DNA تجزیہ سے معلوم ہوا کہ وہ جڑواں ہیں" اور درست ہو جاتا ہے! اپنی کلاسوں میں equals() طریقہ کو اوور رائیڈ کر کے، آپ آسانی سے ضروری آبجیکٹ موازنہ منطق بنا سکتے ہیں۔ ہم نے صرف عام اصطلاحات میں اشیاء کے موازنہ کو چھوا ہے۔ ہمارے پاس اب بھی اس موضوع پر ایک علیحدہ بڑا لیکچر ہوگا (اگر آپ دلچسپی رکھتے ہیں تو آپ اسے جلدی سے پڑھ سکتے ہیں)۔

جاوا میں اسٹرنگ کا موازنہ - اسٹرنگ کا موازنہ

ہم سٹرنگ کے موازنہ کو ہر چیز سے الگ کیوں کرتے ہیں؟ ٹھیک ہے، حقیقت میں، پروگرامنگ میں لائنیں ایک بالکل مختلف کہانی ہیں. سب سے پہلے، اگر آپ بنی نوع انسان کے لکھے ہوئے تمام جاوا پروگراموں کو لیں، تو ان میں تقریباً 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میموری میں ایک نیا علاقہ مختص کیا جائے گا، چاہے نئی لائنوں کے اندر کا متن ایک جیسا ہی ہو! ایسا لگتا ہے کہ ہم نے آپریٹر کو چھانٹ لیا ہے ==، لیکن ہمارے نئے دوست - the equals() طریقہ کا کیا ہوگا؟
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میموری میں مختلف علاقوں کی طرف اشارہ کرتے ہیں۔ لیکن، اس کے باوجود، equals() طریقہ کہتا ہے کہ وہ برابر ہیں۔ کیوں؟ یاد رکھیں، اوپر ہم نے کہا ہے کہ آپ کی کلاس میں برابر () طریقہ کو اوور رائڈ کیا جا سکتا ہے تاکہ یہ آپ کی ضرورت کے مطابق اشیاء کا موازنہ کرے؟ انہوں نے کلاس کے ساتھ یہی کیا String۔ اس میں ایک اوور رائیڈڈ equals() طریقہ ہے۔ اور یہ لنکس کا نہیں بلکہ تاروں میں حروف کی ترتیب کا موازنہ کرتا ہے۔ اور اگر سٹرنگز میں متن ایک جیسا ہے، تو اس سے کوئی فرق نہیں پڑتا کہ وہ کیسے بنائے گئے اور کہاں محفوظ کیے گئے ہیں: سٹرنگ پول میں، یا ایک علیحدہ میموری ایریا میں۔ موازنہ کا نتیجہ درست نکلے گا۔ ویسے، جاوا آپ کو کیس غیر حساس انداز میں تاروں کا صحیح طریقے سے موازنہ کرنے کی اجازت دیتا ہے۔ عام صورت حال میں، اگر آپ ایک لائن لکھتے ہیں، مثال کے طور پر، کیپس میں، تو موازنہ کا نتیجہ غلط ہوگا:
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