61 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Checking for Equality | |||
|  | localeTitle: التحقق من المساواة | |||
|  | --- | |||
|  | # التحقق من المساواة
 | |||
|  | 
 | |||
|  | في Java ، توجد طريقتان للتحقق مما إذا كان هناك متغيرين هما "نفس": `==` و `.equals()` . هذه الطريقتين لا تعمل نفسها ، ولكن. | |||
|  | 
 | |||
|  | ## و `==` المشغل
 | |||
|  | 
 | |||
|  | عملية المساواة الأساسية في Java ، `==` كما في `var1 == var2` ، تتحقق مما إذا كان `var1` و `var2` يشيران إلى نفس _مرجع الكائن_ . بمعنى ، إذا كان `var1` هو نفس _مثيل_ الفئة في الذاكرة كـ `var2` ، فسيكون `var1 == var2` صحيحًا. | |||
|  | 
 | |||
|  | ومع ذلك ، إذا تم إنشاء `var1` و `var2` منفصلتين للفئة (أي مع الكلمة الأساسية `new` ) ، فسيكون `var1 == var2` خاطئًا. حتى إذا كان كل من الكائنين يحتويان على نفس الخصائص والقيم بالضبط ، فإن المقارنة `==` لن تمر لأنها لا تشير إلى نفس الكائن في الذاكرة. | |||
|  | 
 | |||
|  | بالنسبة لأنواع المتغيرات البدائية ، مثل `int` و `double` ، يمكن دائمًا استخدام عامل `==` للتحقق من المساواة ، حيث يتم تخزين قيمها مباشرة مع المتغير (وليس كمرجع إلى فتحة أخرى في الذاكرة). | |||
|  | 
 | |||
|  |  `int var1 = 1;  | |||
|  |  int var2 = 1;  | |||
|  |  System.out.println(var1 == var2) // true  | |||
|  |   | |||
|  |  MyObject obj1 = new MyObject();  | |||
|  |  MyObject obj2 = obj1;  | |||
|  |  MyObject obj3 = new MyObject();  | |||
|  |   | |||
|  |  System.out.println(obj1 == obj2) // true  | |||
|  |  System.out.println(obj1 == obj3) // false  | |||
|  |  System.out.println(obj2 == obj3) // false  | |||
|  | `  | |||
|  | 
 | |||
|  | ## طريقة `.equals()`
 | |||
|  | 
 | |||
|  | تحتوي فئة `Object` المضمنة في Java ، والتي تمتد بها جميع الفئات الأخرى تلقائيًا ، على عدد من الطرق المضمنة المفيدة. إحدى هذه الطرق `equals()` ، والتي تأخذ كائنًا آخر كوسيطة لها وتعيد ما إذا كان ينبغي اعتبار الكائنين "متساويين" وفقًا للمنطق ذي الصلة لهذه الفئة. | |||
|  | 
 | |||
|  | تعد فئة "السلسلة" واحدة من الأمثلة الأكثر شيوعًا للفئة التي تتجاوز طريقة "يساوي ()". عند المقارنة بين "سلعة" للمساواة ، تحتاج إلى استخدام طريقة "يساوي ()" ، لأن "==" لن يعمل كما هو متوقع. | |||
|  | 
 | |||
|  |  `String s1 = "Bob";  | |||
|  |  String s2 = "ob";  | |||
|  |  s2 = "B" + s2; //s2 now is also "Bob"  | |||
|  |  System.out.println(s1 == s2); //false  | |||
|  |  System.out.println(s1.equals(s2)); //true  | |||
|  | `  | |||
|  | 
 | |||
|  | عند إنشاء فئة جديدة في Java ، ستحتاج غالبًا إلى تجاوز طريقة `equals()` لتوفير طريقة أكثر فائدة لمقارنة كائنين من نفس الفئة. كيف يتم تنفيذ هذه الطريقة هو ما يصل تماما إلى حكم المطور. | |||
|  | 
 | |||
|  | على سبيل المثال، قد تقرر أن اثنين من `Person` ق ينبغي النظر "على قدم المساواة" إذا هم `name` و `dateOfBirth` هي نفسها. سيتم تنفيذ هذا المنطق في طريقة `equals()` الخاصة بفئة `Person` : | |||
|  | 
 | |||
|  |  `public class Person {  | |||
|  |     public String name;  | |||
|  |     public Date dateOfBirth;  | |||
|  |   | |||
|  |     public boolean equals(Person person) {  | |||
|  |         return this.name.equals(person.name) && this.dateOfBirth.equals(person.dateOfBirth);  | |||
|  |     }  | |||
|  |  }  | |||
|  | `  | |||
|  | 
 | |||
|  | معظم الفصول المضمنة في Java ، بالإضافة إلى الفئات التي توفرها المكتبات الشائعة ، ستنفذ طريقة `equals()` بطريقة ذات معنى. | |||
|  | 
 | |||
|  | على سبيل المثال، `java.util.Set` تحدد اجهة أن `Set` الصورة `equals()` يرد وطريقة يعود صحيحا إذا "الكائن المحدد أيضا مجموعة، مجموعات لهما نفس الحجم، ولكل عضو من مجموعة محددة في هذه المجموعة ". | |||
|  | 
 | |||
|  | ومع ذلك ، إذا لم تتجاوز فئة تطبيق `equals()` الافتراضي ، فسيتم تطبيق التطبيق الافتراضي ، والذي يستخدم ببساطة عامل `==` لمقارنة العنصرين. |