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));
}
}
Não sei por que todos eles imprimem falsos.
Quando executo "java ByteArray", a resposta é "false false false false".
Acho que a [] é igual a b [], mas a JVM está me dizendo que estou errado, por que ??
Respostas:
Use
Arrays.equals()
se quiser comparar o conteúdo real de matrizes que contêm valores de tipos primitivos (como byte).Use
Arrays.deepEquals
para comparação de matrizes que contêm objetos.fonte
Porque eles não são iguais, ou seja: eles são arrays diferentes com elementos iguais dentro.
Experimente usar
Arrays.equals()
ouArrays.deepEquals()
.fonte
equals()
método?Como o byte [] é mutável, ele é tratado como sendo apenas
.equals()
for o mesmo objeto.Se você quiser comparar o conteúdo, deve usar
Arrays.equals(a, b)
BTW: Não é a forma como eu o projetaria. ;)
fonte
você olhou
Arrays.equals()
?Editar: se, de acordo com seu comentário, o problema for usar uma matriz de bytes como uma chave HashMap, consulte esta questão .
fonte
Se você está tentando usar o array como uma chave HashMap genérica, isso não vai funcionar. Considere a criação de um objeto de wrapper personalizado que contenha a matriz e cujo método
equals(...)
ehashcode(...)
retorne os resultados dos métodos java.util.Arrays. Por exemplo...Os objetos dessa classe de wrapper funcionarão bem como uma chave para o seu
HashMap<MyByteArray, OtherType>
e permitirão o uso limpo dos métodosequals(...)
ehashCode(...)
.fonte
Eles estão retornando false porque você está testando a identidade do objeto em vez de igualdade de valor. Isso retorna falso porque seus arrays são, na verdade, objetos diferentes na memória.
Se você deseja testar a igualdade de valor, deve usar as funções de comparação úteis em java.util.Arrays
por exemplo
fonte
Você também pode usar um
ByteArrayComparator
do diretório Apache . Além de igual , permite comparar se um array é maior que o outro.fonte
Experimente:
Eu também não tenho certeza sobre isso, mas tente fazer isso pode funcionar.
fonte
por que a [] não é igual a b []? Porque a
equals
função realmente chamadaByte[]
oubyte[]
éObject.equals(Object obj)
. Esta função apenas compara a identificação do objeto, não compara o conteúdo do array.fonte
Procurei um empacotador de array que o torne comparável ao uso com guava TreeRangeMap. A classe não aceita comparador.
Depois de alguma pesquisa, percebi que o ByteBuffer do JDK tem esse recurso e não copia o array original, o que é bom. Além disso, você pode comparar mais rápido com ByteBuffer :: asLongBuffer 8 bytes por vez (também não copia). Por padrão, ByteBuffer :: wrap (byte []) usa BigEndian, então a relação de ordem é a mesma que comparar bytes individuais.
.
fonte
Java byte compare,
fonte
Porque nem,
==
nem oequals()
método do array compara o conteúdo; ambos avaliam apenas a identidade do objeto (==
sempre faz, eequals()
não é sobrescrito, então a versão deObject
está sendo usada).Para comparar o conteúdo, use
Arrays.equals()
.fonte
Você também pode usar org.apache.commons.lang.ArrayUtils.isEquals ()
fonte
Arrays.equals
não é suficiente para um comparador, você não pode verificar se o mapa contém os dados. Eu copio o códigoArrays.equals
, modificado para construir umComparator
.fonte
Existe uma maneira mais rápida de fazer isso:
fonte