2012-02-29 17 views
61
public class ByteArr { 

    public static void main(String[] args){ 
     Byte[] a = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; 
     Byte[] b = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; 
     byte[] aa = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; 
     byte[] bb = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; 

     System.out.println(a); 
     System.out.println(b); 
     System.out.println(a == b); 
     System.out.println(a.equals(b)); 

     System.out.println(aa); 
     System.out.println(bb); 
     System.out.println(aa == bb); 
     System.out.println(aa.equals(bb)); 
    } 
} 

मुझे नहीं पता कि वे सभी क्यों झूठे प्रिंट करते हैं।जावा बाइट [] सरणी की तुलना कैसे करें?

जब मैं "जावा बाइटएरे" चलाता हूं, तो जवाब "झूठी झूठी झूठी झूठी" है।

मैं एक [] बी [] के बराबर होती है लेकिन JVM कह रहा है कि मैं गलत कर रहा हूँ क्यों ??

+0

संभावित डुप्लिकेट [दो बाइट Arrays की तुलना करें? (जावा)] (http://stackoverflow.com/questions/5440039/compare-two-byte-arrays-java) – Vadzim

उत्तर

145

उपयोग Arrays.equals() अगर आप सरणियों कि आदिम प्रकार मान होने की वास्तविक सामग्री की तुलना करना चाहते हैं (जैसे लगता है बाइट)।

System.out.println(Arrays.equals(aa, bb)); 

उपयोग Arrays.deepEquals सरणियों है कि वस्तुओं को शामिल की तुलना के लिए।

+0

अगर मेरे पास 'हैश मैप <बाइट [], आईओबफर>' और मैं 'डालता हूं (ए, बफर) ', अगर, मैं प्रिंट करता हूं (map.containsKey (बी))' यह प्रिंट "झूठा" है, क्या यह वही कारण है ???? – Lazy

+3

@Lazy: हाँ, कारण वही है ... आप कच्चे बाइट [] का उपयोग मानचित्रों में कुंजी के रूप में नहीं कर सकते ... और पढ़ें यहां: http://stackoverflow.com/questions/1058149/using-a- बाइट-एरे-ए-हैशमप-की-जावा – Lukasz

4

क्योंकि वे बराबर नहीं हैं, यानी: वे अंदर के बराबर तत्वों के साथ अलग-अलग सरणी हैं।

Arrays.equals() या Arrays.deepEquals() का उपयोग करने का प्रयास करें।

1

क्या आपने Arrays.equals() पर देखा है?

संपादित करें: यदि आपकी टिप्पणी के अनुसार, समस्या हैश मैप कुंजी के रूप में बाइट सरणी का उपयोग कर रही है तो this question देखें।

+0

अगर मेरे पास 'हैश मैप <बाइट [], आईओबफर>' और मैं 'डालता हूं (ए, बफर)',, अगर मैं प्रिंट करता हूं (map.containsKey (बी)) 'यह प्रिंट "झूठा" है, क्या यह वही कारण है ???? – Lazy

+0

@ लाज़ी - देखें http://stackoverflow.com/questions/1058149/using-a-byte-array-as-hashmap-key-java –

0

क्योंकि न तो == और न ही equals() सरणी की विधि सामग्री की तुलना करें; दोनों केवल वस्तु पहचान का मूल्यांकन करते हैं।

सामग्री की तुलना करने के लिए, Arrays.equals() का उपयोग करें।

0

वे झूठी वापसी कर रहे हैं क्योंकि आप मूल्य समानता के बजाय ऑब्जेक्ट पहचान के लिए परीक्षण कर रहे हैं। यह झूठा रिटर्न देता है क्योंकि आपके सरणी वास्तव में स्मृति में अलग-अलग वस्तुएं हैं।

आप मूल्य समानता java.util.Arrays

उदा में काम तुलना कार्यों का उपयोग करना चाहिए के लिए परीक्षण करना चाहते हैं

import java.util.Arrays; 

''''' 

Arrays.equals(a,b); 
2

के रूप में बाइट [] परिवर्तनशील है यह केवल .equals() अगर इसकी एक ही वस्तु के रूप में व्यवहार किया जाता है।

आप सामग्री आप BTW Arrays.equals(a, b)

उपयोग करने के लिए की तुलना करना चाहते हैं: इसकी नहीं जिस तरह से मैं इसे डिजाइन करेंगे। इस के लिए)

0

प्रयास करें:

boolean blnResult = Arrays.equals(byteArray1, byteArray2); 

मैं भी इस बारे में निश्चित नहीं हूँ, लेकिन यह हो सकता है यह काम करता है की कोशिश करो।

1

यदि आप सरणी को सामान्य हैश मैप कुंजी के रूप में उपयोग करने का प्रयास कर रहे हैं, तो यह काम नहीं करेगा। एक कस्टम रैपर ऑब्जेक्ट बनाने पर विचार करें जिसमें सरणी है, और जिसका equals(...) और hashcode(...) विधि java.util.Arrays विधियों से परिणाम देता है। उदाहरण के लिए ...

import java.util.Arrays; 

public class MyByteArray { 
    private byte[] data; 

    // ... constructors, getters methods, setter methods, etc... 


    @Override 
    public int hashCode() { 
     return Arrays.hashCode(data); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
     return true; 
     if (obj == null) 
     return false; 
     if (getClass() != obj.getClass()) 
     return false; 
     MyByteArray other = (MyByteArray) obj; 
     if (!Arrays.equals(data, other.data)) 
     return false; 
     return true; 
    } 


} 

इस आवरण वर्ग की वस्तुओं अपने HashMap<MyByteArray, OtherType> के लिए एक प्रमुख के रूप में कार्य करेंगे और equals(...) और hashCode(...) तरीकों में से साफ उपयोग के लिए अनुमति देगा।

0

आप Apache Directory से ByteArrayComparator का भी उपयोग कर सकते हैं। के अलावा के बराबर यह आपको तुलना करता है कि यदि कोई सरणी अधिक से अधिक है तो तुलना करें।

-3

वहाँ ऐसा करने के लिए एक तेज़ तरीका बताया गया है:

Arrays.hashCode(arr1) == Arrays.hashCode(arr2) 
+1

"तेज़" से आपका मतलब "धीमा" है। – divegeek

0

क्यों एक [] बी [] बराबर नहीं करता है? क्योंकि equals फ़ंक्शन वास्तव में Byte[] या byte[] पर Object.equals(Object obj) पर कॉल किया गया है। यह फ़ंक्शंस केवल ऑब्जेक्ट की पहचान की तुलना करता है, सरणी की सामग्री की तुलना नहीं करता है।

0

मैंने एक सरणी रैपर की तलाश की जो इसे guava TreeRangeMap के साथ उपयोग करने के लिए तुलनीय बनाता है। कक्षा तुलनित्र स्वीकार नहीं करता है।

कुछ शोध के बाद मुझे एहसास हुआ कि जेडीके के बाइटबफर में यह सुविधा है और यह मूल सरणी की प्रतिलिपि नहीं है जो अच्छा है। आप पर अधिक से अधिक बाइटबफर :: asLongBuffer 8 बाइट्स के साथ तेजी से तुलना कर सकते हैं (कॉपी नहीं करता है)। डिफ़ॉल्ट रूप से ByteBuffer :: wrap (बाइट []) BigEndian का उपयोग करें ताकि ऑर्डर रिलेशन अलग बाइट्स की तुलना में समान हो।

संबंधित मुद्दे