2012-02-29 15 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)); 
    } 
} 

No sé por qué todos ellos imprimen en falso.cómo comparar la matriz Java Byte []?

Cuando ejecuto "java ByteArray", la respuesta es "falso falso falso falso".

creo que el a [] b es igual a [], pero la JVM me dice que estoy equivocado, ¿por qué ??

+0

posible duplicado de [¿Comparar dos matrices de bytes? (Java)] (http://stackoverflow.com/questions/5440039/compare-two-byte-arrays-java) – Vadzim

Respuesta

145

Uso Arrays.equals() si desea comparar el contenido real de las matrices que contienen valores de tipos primitivos (como byte).

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

Uso Arrays.deepEquals para la comparación de matrices que contienen objetos.

+0

si tengo un 'HashMap ' e i 'put (a, buffer) ',,, si i' print (map.containsKey (b)) 'imprime "falso", ¿es por la misma razón ???? – Lazy

+3

@Lazy: Sí, la razón es la misma ... no se puede usar el byte sin formato [] como claves en los mapas ... Obtenga más información aquí: http://stackoverflow.com/questions/1058149/using-a- byte-array-as-hashmap-key-java – Lukasz

4

Porque no son iguales, es decir, son matrices diferentes con elementos iguales en su interior.

Intente utilizar Arrays.equals() o Arrays.deepEquals().

1

¿has mirado Arrays.equals()?

Editar: si, según su comentario, el problema es utilizar una matriz de bytes como una clave HashMap, entonces vea this question.

+0

si tengo un 'HashMap ' e i 'put (a, buffer)' ,,, si i 'print (map.containsKey (b)) 'imprime' falso ', ¿es la misma razón ??? – Lazy

+0

@Lazy - vea http://stackoverflow.com/questions/1058149/using-a-byte-array-as-hashmap-key-java –

0

Porque ni == ni el método equals() de la matriz comparan los contenidos; ambos solo evalúan la identidad del objeto.

Para comparar los contenidos, use Arrays.equals().

0

Devuelven falso porque está probando la identidad del objeto en lugar de valorar la igualdad. Esto devuelve falso porque tus matrices son realmente objetos diferentes en la memoria.

Si desea comprobar la igualdad de valor debe utilizar las funciones de comparación útil en java.util.Arrays

por ejemplo,

import java.util.Arrays; 

''''' 

Arrays.equals(a,b); 
2

Como byte [] es mutable se trata como único ser .equals() si es el mismo objeto.

Si desea comparar el contenido que usted tiene que utilizar Arrays.equals(a, b)

BTW: No es la forma en que podría diseñarlo. ;)

0

Try para esto:

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

Tampoco estoy seguro de esto, pero trata de esto puede ser que funciona.

1

Si está tratando de utilizar la matriz como una clave HashMap genérica, eso no va a funcionar. Considere la posibilidad de crear un objeto envoltorio personalizado que contenga la matriz, y cuyo método equals(...) y hashcode(...) devuelva los resultados de los métodos java.util.Arrays. Por ejemplo ...

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


} 

Los objetos de esta clase contenedora no tendrán ningún problema como una clave para su HashMap<MyByteArray, OtherType> y permitirán el uso limpio de equals(...) y hashCode(...) métodos.

0

También puede usar un ByteArrayComparator de Apache Directory. Además de es igual a le permite comparar si una matriz es mayor que la otra.

-3

Hay una manera más rápida de hacerlo:

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

Por "más rápido" quiere decir "más lento". – divegeek

0

por qué un [] no es igual a b []? Porque la función equals realmente llamó en Byte[] o byte[] es Object.equals(Object obj). Esta función solo compara la identificación del objeto, no compara el contenido de la matriz.

0

Busqué un envoltorio de matriz que lo hace comparable al uso con guaraná TreeRangeMap. La clase no acepta el comparador.

Después de algunas investigaciones me di cuenta de que ByteBuffer de JDK tiene esta característica y no copia la matriz original, lo cual es bueno. Más de lo que puede comparar más rápido con ByteBuffer :: asLongBuffer 8 bytes a la vez (también no se copia). Por defecto ByteBuffer :: wrap (byte []) usa BigEndian para que la relación de orden sea la misma que la comparación de bytes individuales.

.