दिलचस्प पोस्ट
दिए गए स्ट्रिंग के लिए सभी अनन्य सबस्ट्रिंग उत्पन्न करें क्या कोई div में शब्द शब्द लपेटने का एक तरीका है? मैं स्रोत से एक आर पैकेज कैसे स्थापित करूं? पृष्ठभूमि सेवा में वॉल्यूम बटन को सुनें? केवल विशिष्ट फ़ाइलप्रकार के लिए विंडो संदर्भ मेनू पर मेनू आइटम जोड़ें पुनर्प्रयास तर्क लिखने का साफ तरीका है? सीआरयूडी ब्लूप्रिंट सेल्स.जेएस में ओवरराइडिंग 3 सबसे हाल के रिकॉर्ड का चयन करें जहां एक स्तंभ के मूल्य अलग-अलग हैं जावा ईई वेब विकास, मैं कहां से शुरू कर सकता हूं और मुझे किस कौशल की ज़रूरत है? तुलना ऑपरेटरों को 'ट्यूपल' और 'टाई' के माध्यम से लागू करना, एक अच्छा विचार है? जावा एफएक्स वेबव्यू पूरे क्षेत्र को भरने के लिए बढ़ता है एकाधिक सीमांकक के साथ स्ट्रिंग.split () का उपयोग करें सर्वर इंटरैक्शन के बिना CSV फ़ाइल में जावास्क्रिप्ट डेटा निर्यात करें ऑब्जेक्ट == रिक्त या शून्य == ऑब्जेक्ट? iframe केवल पृष्ठ का एक निश्चित भाग दिखाने के लिए

जावा में अरैज़.एक्वल्स बनाम बराबर है

जब जावा में एआरएर की तुलना करते हैं, तो क्या निम्न 2 कथन के बीच कोई अंतर है?

array1.equals(array2); Arrays.equals(array1, array2); 

और यदि ऐसा है तो वे क्या हैं?

वेब के समाधान से एकत्रित समाधान "जावा में अरैज़.एक्वल्स बनाम बराबर है"

array1.equals(array2) array1 == array2 array1.equals(array2) के समान है, यानी यह समान सरणी है। चूंकि @ आधे अंक बताते हैं कि ज्यादातर लोगों की क्या उम्मीद नहीं है

Arrays.equals(array1, array2) सरणियों की सामग्री की तुलना करती है।


इसी तरह array.toString() बहुत उपयोगी नहीं हो सकता है और आपको Arrays.toString(array) का उपयोग Arrays.toString(array)

यह एक कुख्यात समस्या है:। Arrays के लिए .equals() बुरी तरह से टूटा हुआ है, बस इसका उपयोग न करें, कभी भी।

उसने कहा, यह "टूटा हुआ" नहीं है जैसा कि "किसी ने वास्तव में गलत तरीके से किया है" – यह सिर्फ वही कर रहा है जो परिभाषित है और जो आमतौर पर अपेक्षित नहीं है। तो शुद्धवादियों के लिए: यह बिल्कुल ठीक है, और इसका भी मतलब है, इसका उपयोग कभी नहीं करें

अब equals लिए अपेक्षित व्यवहार आंकड़ों की तुलना करना है। डिफ़ॉल्ट व्यवहार पहचान की तुलना करना है, क्योंकि Object में कोई डेटा नहीं है (शुद्धता के लिए: हाँ यह है, लेकिन यह बिंदु नहीं है); धारणा है, यदि आपको उप-कक्षाओं में equals आवश्यकता है, तो आप इसे लागू करेंगे। सरणियों में, आपके लिए कोई क्रियान्वयन नहीं है, इसलिए आप इसका उपयोग नहीं करना चाहते हैं।

तो अंतर यह है कि, Arrays.equals(array1, array2) , Arrays.equals(array1, array2) आपको अपेक्षा करता है (यानी सामग्री की तुलना करता है), array1.equals(array2) Object.equals कार्यान्वयन पर वापस Object.equals है, जो बदले में पहचान की तुलना करती है, और इस प्रकार बेहतर == (शुद्धता के लिए: हाँ, मैं null बारे में जानता हूं)

समस्या है, यहां तक ​​कि Arrays.equals(array1, array2) आपको मुश्किल से काट लेंगे यदि सरणी के तत्व ठीक से equals से लागू नहीं करते हैं। यह एक बहुत ही स्पष्ट बयान है, मुझे पता है, लेकिन एक बहुत ही कम-से-स्पष्ट मामला है: 2 डी सरणी पर विचार करें

जावा में 2 डी सरणी सरणी है, और arrays ' equals टूट गया है (या यदि आप पसंद करते हैं तो बेकार), तो Arrays.equals(array1, array2) 2 डी सरणियों पर अपेक्षा के अनुसार काम नहीं करेगा।

उम्मीद है की वो मदद करदे।

इन विधियों के कार्यान्वयन में उन्हें गहराई से समझें:

 array1.equals(array2); 
 /** * Indicates whether some other object is "equal to" this one. * <p> * The {@code equals} method implements an equivalence relation * on non-null object references: * <ul> * <li>It is <i>reflexive</i>: for any non-null reference value * {@code x}, {@code x.equals(x)} should return * {@code true}. * <li>It is <i>symmetric</i>: for any non-null reference values * {@code x} and {@code y}, {@code x.equals(y)} * should return {@code true} if and only if * {@code y.equals(x)} returns {@code true}. * <li>It is <i>transitive</i>: for any non-null reference values * {@code x}, {@code y}, and {@code z}, if * {@code x.equals(y)} returns {@code true} and * {@code y.equals(z)} returns {@code true}, then * {@code x.equals(z)} should return {@code true}. * <li>It is <i>consistent</i>: for any non-null reference values * {@code x} and {@code y}, multiple invocations of * {@code x.equals(y)} consistently return {@code true} * or consistently return {@code false}, provided no * information used in {@code equals} comparisons on the * objects is modified. * <li>For any non-null reference value {@code x}, * {@code x.equals(null)} should return {@code false}. * </ul> * <p> * The {@code equals} method for class {@code Object} implements * the most discriminating possible equivalence relation on objects; * that is, for any non-null reference values {@code x} and * {@code y}, this method returns {@code true} if and only * if {@code x} and {@code y} refer to the same object * ({@code x == y} has the value {@code true}). * <p> * Note that it is generally necessary to override the {@code hashCode} * method whenever this method is overridden, so as to maintain the * general contract for the {@code hashCode} method, which states * that equal objects must have equal hash codes. * * @param obj the reference object with which to compare. * @return {@code true} if this object is the same as the obj * argument; {@code false} otherwise. * @see #hashCode() * @see java.util.HashMap */ public boolean equals(Object obj) { return (this == obj); } 

जबकि:

 Arrays.equals(array1, array2); 
 /** * Returns <tt>true</tt> if the two specified arrays of Objects are * <i>equal</i> to one another. The two arrays are considered equal if * both arrays contain the same number of elements, and all corresponding * pairs of elements in the two arrays are equal. Two objects <tt>e1</tt> * and <tt>e2</tt> are considered <i>equal</i> if <tt>(e1==null ? e2==null * : e1.equals(e2))</tt>. In other words, the two arrays are equal if * they contain the same elements in the same order. Also, two array * references are considered equal if both are <tt>null</tt>.<p> * * @param a one array to be tested for equality * @param a2 the other array to be tested for equality * @return <tt>true</tt> if the two arrays are equal */ public static boolean equals(Object[] a, Object[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) { Object o1 = a[i]; Object o2 = a2[i]; if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return true; } 

आह। 70 के दशक में मैं आईबीएम 370 सिस्टम के लिए "सिस्टम प्रोग्रामर" (सिसैडमिन) था, और मेरे नियोक्ता आईबीएम के उपयोगकर्ता समूह के एक सदस्य थे। यह कभी-कभी ऐसा होता है कि किसी व्यक्ति ने कुछ सीएमएस कमांड के कुछ अप्रत्याशित व्यवहार पर एपीएआर (बग रिपोर्ट) पेश किया, और आईबीएम ने NOTABUG का जवाब दिया: यह कमांड करता है जो इसे करने के लिए डिजाइन किया गया था (और दस्तावेज़ीकरण क्या कहते हैं)।

शेयर इस पर एक काउंटर के साथ आया: बीएडी – टूटी हुई डिज़ाइन मुझे लगता है कि यह एरे के लिए बराबर के कार्यान्वयन पर लागू हो सकता है

Object.equals के कार्यान्वयन में कुछ भी गलत नहीं है। ऑब्जेक्ट में कोई डेटा सदस्य नहीं है, इसलिए तुलना करने के लिए कुछ भी नहीं है। दो "ऑब्जेक्ट" समान हैं और यदि वे वास्तव में हैं, तो वही वस्तु (आंतरिक रूप से, एक ही पता और लंबाई)।

लेकिन यह तर्क सरणियों पर लागू नहीं होता है एरेज़ में डेटा है, और आप डेटा की तुलना करने के लिए तुलना (बराबर के माध्यम से) की अपेक्षा करते हैं। आदर्श रूप में, जिस तरह से Arrays.deepEquals करता है, लेकिन कम से कम arrays.equals करता है (तत्वों की उथले तुलना) करता है।

तो समस्या यह है कि सरणी (एक अंतर्निहित ऑब्जेक्ट के रूप में) ऑब्जेक्ट ओवल ओवरराइड नहीं करता है। स्ट्रिंग (एक नामित वर्ग के रूप में) ऑब्जेक्ट.एक्वायल ओवरराइड करता है और आपको उम्मीद है कि परिणाम दे।

दिए गए अन्य उत्तर सही हैं: […]। बराबर ([….]) बस संकेतक की तुलना करते हैं और न कि सामग्री। शायद किसी को यह सही होगा। या शायद नहीं: यदि मौजूदा कार्यक्रमों को तोड़ दिया जाए तो […] तत्वों की तुलना में वास्तव में बराबर होगा? बहुत ज्यादा नहीं, मुझे संदेह है, लेकिन शून्य से अधिक

ऑरेज़ Object से equals() प्राप्त करते हैं और इसलिए केवल रिटर्न की तुलना करते हैं, अगर खुद के विरुद्ध सरणी की तुलना करते हैं।

दूसरी ओर, Arrays.equals सरणियों के तत्वों की तुलना करती है।

यह स्निपेट अंतर को स्पष्ट करता है:

 Object o1 = new Object(); Object o2 = new Object(); Object[] a1 = { o1, o2 }; Object[] a2 = { o1, o2 }; System.out.println(a1.equals(a2)); // prints false System.out.println(Arrays.equals(a1, a2)); // prints true 

Arrays.equals() भी देखें। एक और स्थिर विधि भी हो सकती है ब्याज: Arrays.deepEquals()

Arrays.equals(array1, array2) :

जांच लें कि दोनों arrays में तत्वों की एक ही संख्या होती है, और दो सरणियों के तत्वों के सभी समान जोड़े बराबर हैं।

array1.equals(array2) :

ऑब्जेक्ट की तुलना किसी अन्य ऑब्जेक्ट से करें और केवल सच ही लौटाए, यदि ऑब्जेक्ट के बराबर दोनों ऑब्जेक्ट के संदर्भ बराबर हैं।

एरे के equals() Object से विरासत में मिला है, इसलिए यह एरेरे की सामग्री को नहीं दिखता है, यह केवल प्रत्येक सरणी को स्वयं के बराबर मानता है।

Arrays.equals() विधियां एरेज़ की सामग्री की तुलना करती हैं सभी आदिम प्रकारों के लिए अधिभार है, और ऑब्जेक्ट के लिए एक ऑब्जेक्ट्स के स्वयं के equals() तरीके का उपयोग करता है।

 import java.util.Arrays; public class ArrayDemo { public static void main(String[] args) { // initiliazing three object arrays Object[] arr1 = new Object[] { 1, 123 }; Object[] arr2 = new Object[] { 1, 123, 22, 4 }; Object[] arr3 = new Object[] { 1, 123 }; // comparing arr1 and arr2 boolean retval=Arrays.equals(arr1, arr2); System.out.println("arr1 and arr2 equal: " + retval); System.out.println("arr1 and arr2 equal: " + arr1.equals(arr2)); // comparing arr1 and arr3 boolean retval2=Arrays.equals(arr1, arr3); System.out.println("arr1 and arr3 equal: " + retval2); System.out.println("arr1 and arr2 equal: " + arr1.equals(arr3)); } } 

यहां आउटपुट दिया गया है:

  arr1 and arr2 equal: false arr1 and arr2 equal: false arr1 and arr3 equal: true arr1 and arr3 equal: false 

इस तरह की समस्या को देखते हुए मैं व्यक्तिगत रूप से Arrays.equals(array1, array2) लिए जाने Arrays.equals(array1, array2) आपके प्रश्न के अनुसार भ्रम से बचें।