البرمجة

فهم دالة equals() في جافا

المشكلة التي تواجهها في الكود تتعلق بفهمك لكيفية عمل دالة equals() في لغة البرمجة جافا، وهي دالة تُستخدم لمقارنة المحتوى بين كائنين. تسأل عما تقوم به الدالة equals() في جافا، ولنتعمق في الفهم.

عند استخدام equals() لمقارنة سلسلتين في جافا، فإنها تقوم بمقارنة محتواهما، بمعنى أنها تقارن القيمة الفعلية لكل سلسلة بدلاً من مقارنة مراجعهما في الذاكرة. وهذا يعني أنه عند استدعاء equals() على سلسلتين، فإن الدالة تقارن الأحرف التي تتألف منها السلاسل، وإذا كانت الأحرف متطابقة بالترتيب الصحيح، فإن الدالة تعيد القيمة true.

في الكود الذي قدمته، تقوم بفحص ما إذا كان آخر حرف في السلسلة هو “;” أو لا، وعلى هذا الأساس تقوم بإضافة “;” إذا كانت السلسلة لا تنتهي به. ولكن، بسبب استخدام علامة الاستفهام (!) قبل استدعاء equals()، فإنك بالفعل تقول “إذا كان الحرف الأخير في السلسلة ليس “;”، وبالتالي يتم تنفيذ الشرط وإضافة “;”.

بمعنى آخر، علامة الاستفهام (!) تقوم بعكس نتيجة الشرط. فعندما تستدعي !((s.substring(s.length() - 1)).equals(";"))، فإنك تقول “إذا كان الحرف الأخير في السلسلة ليس “;”، ولكن في الحقيقة، إذا كان الحرف الأخير هو “;”، فإن الشرط سيكون صحيحاً بالنسبة لعلامة الاستفهام (!)، وبالتالي يتم تنفيذ الكود داخل الشرط.

لحل المشكلة وجعل الشرط يعمل كما تتوقع، يمكنك ببساطة إزالة علامة الاستفهام (!)، حتى يصبح الشرط كالتالي:

java
if((s.substring(s.length() - 1)).equals(";")){ s = s + ";"; }

وبهذا التعديل، سيقوم الشرط بالعمل كما تتوقع، حيث إنه سيتحقق فقط إذا كان الحرف الأخير في السلسلة هو “;”، وإلا فلن يتم تنفيذ الكود داخل الشرط.

المزيد من المعلومات

عندما نتحدث عن استخدام دالة equals() في لغة البرمجة جافا، فإنه من المهم فهم الفارق بينها وبين عمليات المقارنة الأخرى مثل ==. فعندما تستخدم عملية المقارنة == في جافا، فإنها تقارن مراجع الكائنات، أي أنها تحاول معرفة ما إذا كانت الكائنات تشير إلى نفس الموقع في الذاكرة أم لا، بينما دالة equals() تقارن المحتوى الفعلي للكائنات.

مثلاً، إذا قمت بتعريف سلسلتين String مختلفتين ولكن تحتويان على نفس المحتوى، وثم استخدمت == لمقارنتهما، فستحصل على نتيجة false لأنهما يشيران إلى مساحات ذاكرة مختلفة. ولكن عند استخدام equals() ستحصل على نتيجة true لأنها تقارن المحتوى الفعلي للسلاسل وتجد أنهما متطابقتان.

في السياق الخاص بالكود الذي قدمته، كانت المشكلة تكمن في استخدام علامة الاستفهام (!) قبل استدعاء equals()، مما أدى إلى عكس نتيجة الشرط. بمجرد إزالة علامة الاستفهام (!)، تم تصحيح السلوك المتوقع للكود.

ومن الجدير بالذكر أنه يجب دائماً استخدام دالة equals() عند قيامك بمقارنة محتوى السلاسل في جافا، خاصة عند التعامل مع بيانات المستخدم أو بيانات الإدخال الخارجي، لأنها تضمن دقة المقارنة وتجنب الأخطاء الناتجة عن افتراضات غير صحيحة حول مواقع الذاكرة.

بهذا الشكل، يمكنك فهم كيفية عمل دالة equals() في جافا وكيفية استخدامها بشكل صحيح للحصول على السلوك المطلوب في برمجياتك.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!