ما الفرق بين == و equals() في Java؟
مرحبًا أيها الزملاء! لقد بدأت للتو في تعلم Java وواجهت موقفًا غير مفهوم عند مقارنة النصوص. كتبت كودًا بسيطًا:
```java
String a = "Привет";
String b = "Привет";
String c = new String("Привет");
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true
```
لماذا `a == b` يُرجع `true`، ولكن `a == c` يُرجع `false`؟ وما علاقة `equals()` بهذا؟ كنت أعتقد أن كلا العاملين يقارنان القيم. ما هي الخدعة؟ اشرحوا لي، من فضلكم، كمبتدئ، متى أستخدم `==` ومتى أستخدم `equals()`. يهمني بشكل خاص كيف يعمل هذا مع النصوص والكائنات الأخرى.
<<>>
الفرق الرئيسي: مقارنة المراجع مقابل مقارنة المحتوى
الفرق الجوهري بين == و equals() هو أن == يقارن المراجع (references) أي عناوين الذاكرة، بينما equals() يقارن المحتوى الفعلي للكائنات.
في حالتك مع النصوص (Strings):
a == bيُرجعtrueلأن Java تستخدم String Pool - عندما تنشئ نصًا باستخدام علامات الاقتباس المزدوجة، تتحقق Java أولاً مما إذا كان هناك نص مماثل موجود بالفعل في String Pool، وإذا كان موجودًا، فإنها تعيد المرجع نفسه. لذلك يشير كل منaوbإلى نفس الكائن في الذاكرة.a == cيُرجعfalseلأن استخدامnew String()يُنشئ كائنًا جديدًا في الذاكرة (Heap) بغض النظر عن المحتوى. لذلكaوcيشيران إلى كائنين مختلفين في الذاكرة.a.equals(c)يُرجعtrueلأنequals()يقارن المحتوى الفعلي للنصوص، وكلاهما يحتوي على نفس النص "Привет".
باختصار:
- استخدم
==عندما تريد التحقق مما إذا كان متغيرين يشيران إلى نفس الكائن في الذاكرة (مقارنة المراجع). - استخدم
equals()عندما تريد التحقق مما إذا كان كائنين لهما نفس المحتوى أو القيمة المنطقية (مقارنة المحتوى).
هذا ينطبق على جميع الكائنات في Java، وليس فقط النصوص. بالنسبة للأنواع البدائية