assertEquals
equals
तुलना के लिए विधि का उपयोग करता है । वहाँ एक अलग मुखर है assertSame
, जो का उपयोग करता है==
ऑपरेटर ।
यह समझने के लिए कि ==
तार का उपयोग क्यों नहीं किया जाना चाहिए, आपको ==
यह समझने की आवश्यकता है कि क्या होता है: यह एक पहचान की जाँच करता है। यही है, यह a == b
देखने के लिए जाँच करता है कि क्या a
और उसी ऑब्जेक्टb
को संदर्भित करता है । यह भाषा में बनाया गया है, और इसके व्यवहार को विभिन्न वर्गों द्वारा नहीं बदला जा सकता है। विधि, दूसरे हाथ पर, वर्गों द्वारा अधिरोहित जा सकता है। जबकि इसका डिफ़ॉल्ट व्यवहार ( कक्षा में) ऑपरेटर का उपयोग करके एक पहचान की जांच करना है , कई कक्षाएं, जिनमें से , इसे "समतुल्यता" चेक करने के लिए ओवरराइड करता है। के मामले में , जाँच के बजाय अगर और उसी वस्तु को देखें,equals
Object
==
String
String
a
b
a.equals(b)
यह देखने के लिए जांचें कि क्या वे जिन वस्तुओं को संदर्भित करते हैं, वे दोनों तार हैं जिनमें बिल्कुल समान वर्ण हैं।
सादृश्य समय: कल्पना करें कि प्रत्येक String
वस्तु कागज का एक टुकड़ा है जिस पर कुछ लिखा गया है। मान लीजिए कि मेरे पास उन पर लिखे "फू" के साथ कागज के दो टुकड़े हैं, और दूसरे पर "बार" लिखा है। यदि मैं कागज के पहले दो टुकड़े लेता हूं और ==
उनकी तुलना करने के लिए उपयोग करता हूं तो यह वापस आ जाएगा false
क्योंकि यह अनिवार्य रूप से पूछ रहा है "क्या ये कागज के एक ही टुकड़े हैं?"। यह भी देखने की जरूरत नहीं है कि कागज पर क्या लिखा है। तथ्य यह है कि मैं इसे कागज के दो टुकड़े दे रहा हूं (बल्कि एक ही बार दो बार) का मतलब है कि यह वापस आ जाएगा false
। यदि मैं उपयोग करता हूं equals
, हालांकि, equals
विधि कागज के दो टुकड़ों को पढ़ेगी और देखेगी कि वे एक ही बात कहते हैं ("फू"), और इसलिए यह वापस आ जाएगी true
।
स्ट्रिंग्स के साथ भ्रमित होने वाली बिट यह है कि जावा में "इंटर्निंग" स्ट्रिंग्स की एक अवधारणा है, और यह (प्रभावी रूप से) आपके कोड में किसी भी स्ट्रिंग शाब्दिक पर स्वचालित रूप से किया जाता है। इसका मतलब है कि यदि आपके पास अपने कोड में दो बराबर स्ट्रिंग शाब्दिक हैं (भले ही वे अलग-अलग कक्षाओं में हों) तो वे वास्तव में दोनों एक ही String
वस्तु को संदर्भित करेंगे । यह ==
ऑपरेटर true
को एक से अधिक बार वापसी की उम्मीद कर सकता है।