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 imprimen falso.
Cuando ejecuto "java ByteArray", la respuesta es "falso falso falso falso".
Creo que a [] es igual a b [] pero la JVM me dice que estoy equivocado, ¿por qué?
Respuestas:
Úselo
Arrays.equals()
si desea comparar el contenido real de matrices que contienen valores de tipos primitivos (como byte).Se utiliza
Arrays.deepEquals
para comparar matrices que contienen objetos.fuente
Porque no son iguales, es decir, son matrices diferentes con elementos iguales en su interior.
Intente usar
Arrays.equals()
oArrays.deepEquals()
.fuente
equals()
método?Como el byte [] es mutable, se trata como
.equals()
si fuera el mismo objeto.Si quieres comparar los contenidos tienes que utilizar
Arrays.equals(a, b)
Por cierto: no es la forma en que lo diseñaría. ;)
fuente
has mirado
Arrays.equals()
?Editar: si, según su comentario, el problema es usar una matriz de bytes como clave HashMap, consulte esta pregunta .
fuente
Si está tratando de usar la matriz como una clave HashMap genérica, eso no funcionará. Considere la posibilidad de crear un objeto contenedor personalizado que contenga la matriz y cuyo método
equals(...)
yhashcode(...)
devuelva los resultados de los métodos java.util.Arrays. Por ejemplo...Los objetos de esta clase contenedora funcionarán bien como clave para usted
HashMap<MyByteArray, OtherType>
y permitirán un uso limpio de los métodosequals(...)
yhashCode(...)
.fuente
Devuelven falso porque está probando la identidad del objeto en lugar de la igualdad de valores. Esto devuelve falso porque sus matrices son en realidad diferentes objetos en la memoria.
Si desea probar la igualdad de valores, debe usar las prácticas funciones de comparación en java.util.Arrays
p.ej
fuente
También puede utilizar un archivo
ByteArrayComparator
de Apache Directory . Además de igual, le permite comparar si una matriz es mayor que la otra.fuente
Intente esto:
Tampoco estoy seguro de esto, pero intente que esto funcione.
fuente
¿Por qué a [] no es igual a b []? Porque la
equals
función realmente se llamaByte[]
obyte[]
estáObject.equals(Object obj)
. Esta función solo compara la identificación del objeto, no compara el contenido de la matriz.fuente
Busqué un contenedor de matriz que lo haga comparable al uso con guava TreeRangeMap. La clase no acepta comparador.
Después de investigar un poco, me di cuenta de que ByteBuffer de JDK tiene esta función y no copia la matriz original, lo cual es bueno. Además, puede comparar más rápido con ByteBuffer :: asLongBuffer 8 bytes a la vez (tampoco copia). Por defecto, ByteBuffer :: wrap (byte []) usa BigEndian para que la relación de orden sea la misma que comparar bytes individuales.
.
fuente
Comparación de bytes de Java,
fuente
Porque
==
ni elequals()
método de la matriz compara los contenidos; ambos solo evalúan la identidad del objeto (==
siempre lo hace yequals()
no se sobrescribe, por lo queObject
se usa la versión de ).Para comparar los contenidos, utilice
Arrays.equals()
.fuente
También puede utilizar org.apache.commons.lang.ArrayUtils.isEquals ()
fuente
Arrays.equals
no es suficiente para un comparador, no se puede comprobar que el mapa contiene los datos. Copio el código deArrays.equals
, modificado para compilar unComparator
.fuente
Hay una forma más rápida de hacerlo:
fuente