วิธีเปรียบเทียบอาร์เรย์ Java Byte []


93
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));
    }
}

ฉันไม่รู้ว่าทำไมทุกคนถึงพิมพ์เท็จ

เมื่อฉันเรียกใช้ "java ByteArray" คำตอบคือ "false false false false"

ฉันคิดว่า a [] เท่ากับ b [] แต่ JVM กำลังบอกฉันว่าฉันผิดทำไม ??


เป็นไปได้ที่จะทำสำเนาเปรียบเทียบสองไบต์อาร์เรย์? (Java)
Vadzim

Arrays.equals ใช้งานได้ เรียกใช้และตรวจสอบออนไลน์ที่นี่onecompiler.com/java/3wc4ec2su
karthikdivi

คำตอบ:


193

ใช้Arrays.equals()ถ้าคุณต้องการเปรียบเทียบเนื้อหาจริงของอาร์เรย์ที่มีค่าประเภทดั้งเดิม (เช่นไบต์)

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

ใช้Arrays.deepEqualsสำหรับการเปรียบเทียบอาร์เรย์ที่มีวัตถุ


ถ้าฉันมี 'HashMap <byte [], IoBuffer>' และฉัน 'ใส่ (a, บัฟเฟอร์)',, ถ้าฉัน 'พิมพ์ (map.containsKey (b))' มันพิมพ์ "เท็จ" มันเหมือนกันหรือไม่ เหตุผล????
Lazy

3
@Lazy: ใช่เหตุผลเหมือนกัน ... คุณไม่สามารถใช้ raw byte [] เป็นคีย์ในแผนที่ ... อ่านเพิ่มเติมที่นี่: stackoverflow.com/questions/1058149/…
Lukasz

6

ทำให้ไม่เท่ากันกล่าวคือเป็นอาร์เรย์ที่แตกต่างกันโดยมีองค์ประกอบเท่ากันอยู่ภายใน

ลองใช้Arrays.equals()หรือArrays.deepEquals().


นั่นเป็นส่วนหนึ่งของเรื่องไร้สาระของ Java: ทำไมต้องใช้วิธีการแบบคงที่จากคลาสอื่นเพื่อเปรียบเทียบวัตถุในคลาสอื่น นั่นคือ: ทำไมพวกเขาไม่ลบล้างequals()วิธีการนี้
U. Windl

3

เนื่องจากไบต์ [] มีความผันแปรจึงถือว่าเป็นเพียง.equals()วัตถุเดียวกันเท่านั้น

หากคุณต้องการเปรียบเทียบเนื้อหาที่คุณต้องใช้ Arrays.equals(a, b)

BTW: มันไม่ใช่วิธีที่ฉันจะออกแบบ ;)


1

คุณได้ดูArrays.equals()?

แก้ไข: หากตามความคิดเห็นของคุณปัญหาคือการใช้อาร์เรย์ไบต์เป็นคีย์ HashMap จากนั้นให้ดูคำถามนี้


ถ้าฉันมี 'HashMap <byte [], IoBuffer>' และฉัน 'ใส่ (a, บัฟเฟอร์)',, ถ้าฉัน 'พิมพ์ (map.containsKey (b))' มันพิมพ์ "เท็จ" มันเหมือนกันหรือไม่ เหตุผล????
Lazy


1

หากคุณกำลังพยายามใช้อาร์เรย์เป็นคีย์ HashMap ทั่วไปจะไม่ได้ผล พิจารณาสร้างออบเจ็กต์ wrapper แบบกำหนดเองที่เก็บอาร์เรย์และซึ่งมี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;
   }


}

ออบเจ็กต์ของคลาส Wrapper นี้จะทำงานได้ดีเป็นกุญแจสำคัญสำหรับคุณHashMap<MyByteArray, OtherType>และจะอนุญาตให้ใช้equals(...)และhashCode(...)วิธีการแบบใหม่ทั้งหมด


0

พวกเขาส่งคืนเท็จเนื่องจากคุณกำลังทดสอบเอกลักษณ์ของวัตถุแทนที่จะเป็นความเท่าเทียมกันของค่า สิ่งนี้ส่งคืนเท็จเนื่องจากอาร์เรย์ของคุณเป็นวัตถุที่แตกต่างกันในหน่วยความจำ

หากคุณต้องการทดสอบความเท่าเทียมกันของค่าควรใช้ฟังก์ชันเปรียบเทียบที่มีประโยชน์ใน java.util.Arrays

เช่น

import java.util.Arrays;

'''''

Arrays.equals(a,b);

0

นอกจากนี้คุณยังสามารถใช้ByteArrayComparatorจากApache ไดเรกทอรี นอกจากนี้จะเท่ากับว่ามันช่วยให้คุณเปรียบเทียบหากอาร์เรย์เป็นมากขึ้นกว่าที่อื่น ๆ


0

ลองทำสิ่งนี้:

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

ฉันยังไม่แน่ใจเกี่ยวกับเรื่องนี้ แต่ลองดูอาจได้ผล


0

ทำไม a [] ไม่เท่ากับ b []? เพราะequalsฟังก์ชั่นจริงๆเรียกByte[]หรือเป็นbyte[] Object.equals(Object obj)ฟังก์ชันนี้จะเปรียบเทียบเฉพาะการระบุอ็อบเจ็กต์เท่านั้นอย่าเปรียบเทียบเนื้อหาของอาร์เรย์


0

ฉันมองหาเครื่องห่ออาร์เรย์ซึ่งทำให้เทียบได้กับการใช้กับฝรั่ง TreeRangeMap ชั้นเรียนไม่ยอมรับตัวเปรียบเทียบ

หลังจากการวิจัยบางส่วนฉันได้รู้ว่า ByteBuffer จาก JDK มีคุณสมบัตินี้และไม่ได้คัดลอกอาร์เรย์ดั้งเดิมซึ่งดี ยิ่งไปกว่านั้นคุณสามารถเปรียบเทียบได้เร็วขึ้นด้วย ByteBuffer :: asLongBuffer 8 ไบต์ในเวลาเดียวกัน (ยังไม่ได้คัดลอก) โดยค่าเริ่มต้น ByteBuffer :: wrap (byte []) ใช้ BigEndian ดังนั้นความสัมพันธ์ของลำดับจึงเหมือนกับการเปรียบเทียบแต่ละไบต์

.


0

Java byte เปรียบเทียบ

public static boolean equals(byte[] a, byte[] 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++)
            if (a[i] != a2[i])
                return false;

        return true;
    }

0

เพราะค่า==หรือequals()วิธีการของอาร์เรย์เปรียบเทียบเนื้อหา; ทั้งสองประเมินเอกลักษณ์ของวัตถุเท่านั้น (ทำ==เสมอและequals()ไม่ถูกเขียนทับดังนั้นเวอร์ชันจากObject )

Arrays.equals()สำหรับการเปรียบเทียบเนื้อหาการใช้งาน



0

Arrays.equalsไม่เพียงพอสำหรับตัวเปรียบเทียบคุณไม่สามารถตรวจสอบแผนที่มีข้อมูลได้ ฉันคัดลอกรหัสจากArrays.equalsแก้ไขเพื่อสร้างไฟล์Comparator.

class ByteArrays{
    public static <T> SortedMap<byte[], T> newByteArrayMap() {
        return new TreeMap<>(new ByteArrayComparator());
    }

    public static SortedSet<byte[]> newByteArraySet() {
        return new TreeSet<>(new ByteArrayComparator());
    }

    static class ByteArrayComparator implements Comparator<byte[]> {
        @Override
        public int compare(byte[] a, byte[] b) {
            if (a == b) {
                return 0;
            }
            if (a == null || b == null) {
                throw new NullPointerException();
            }

            int length = a.length;
            int cmp;
            if ((cmp = Integer.compare(length, b.length)) != 0) {
                return cmp;
            }

            for (int i = 0; i < length; i++) {
                if ((cmp = Byte.compare(a[i], b[i])) != 0) {
                    return cmp;
                }
            }

            return 0;
        }
    }
}

-4

มีวิธีที่เร็วกว่านี้:

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

2
โดย "เร็วกว่า" หมายความว่า "ช้ากว่า"
divegeek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.