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));
}
}
Je ne sais pas pourquoi tous affichent des faux.
Lorsque je lance "java ByteArray", la réponse est "false false false false".
Je pense que a [] est égal à b [] mais la JVM me dit que je me trompe, pourquoi ??
Réponses:
À utiliser
Arrays.equals()
si vous souhaitez comparer le contenu réel des tableaux contenant des valeurs de types primitifs (comme byte).À utiliser
Arrays.deepEquals
pour la comparaison de tableaux contenant des objets.la source
Parce qu'ils ne sont pas égaux, c'est-à-dire: ce sont des tableaux différents avec des éléments égaux à l'intérieur.
Essayez d'utiliser
Arrays.equals()
ouArrays.deepEquals()
.la source
equals()
méthode?Comme byte [] est mutable, il est traité comme étant uniquement
.equals()
s'il s'agit du même objet.Si vous souhaitez comparer les contenus que vous devez utiliser
Arrays.equals(a, b)
BTW: Ce n'est pas la façon dont je le concevrais. ;)
la source
avez-vous regardé
Arrays.equals()
?Edit: si, selon votre commentaire, le problème utilise un tableau d'octets comme clé HashMap, consultez cette question .
la source
Si vous essayez d'utiliser le tableau en tant que clé HashMap générique, cela ne fonctionnera pas. Envisagez de créer un objet wrapper personnalisé qui contient le tableau et dont la méthode
equals(...)
andhashcode(...)
renvoie les résultats des méthodes java.util.Arrays. Par exemple...Les objets de cette classe wrapper fonctionneront correctement comme clé pour votre
HashMap<MyByteArray, OtherType>
et permettront une utilisation propre des méthodesequals(...)
ethashCode(...)
.la source
Ils renvoient false car vous testez l'identité d'objet plutôt que l'égalité des valeurs. Cela renvoie false car vos tableaux sont en fait des objets différents en mémoire.
Si vous souhaitez tester l'égalité des valeurs, utilisez les fonctions de comparaison pratiques de java.util.Arrays
par exemple
la source
Vous pouvez également utiliser un
ByteArrayComparator
depuis Apache Directory . En plus d' égal, il vous permet de comparer si un tableau est plus grand que l'autre.la source
Essayez ceci:
Je ne suis pas sûr non plus à ce sujet, mais essayez cela peut-être que cela fonctionne.
la source
pourquoi a [] n'est pas égal à b []? Parce que la
equals
fonction est vraiment appeléeByte[]
ou l'byte[]
estObject.equals(Object obj)
. Cette fonction compare uniquement l'identification d'objet, ne compare pas le contenu du tableau.la source
J'ai cherché un wrapper de tableau qui le rend comparable à une utilisation avec la goyave TreeRangeMap. La classe n'accepte pas le comparateur.
Après quelques recherches, j'ai réalisé que ByteBuffer de JDK a cette fonctionnalité et qu'il ne copie pas le tableau d'origine, ce qui est bien. De plus, vous pouvez comparer plus rapidement avec ByteBuffer :: asLongBuffer 8 octets à la fois (ne copie pas non plus). Par défaut, ByteBuffer :: wrap (byte []) utilise BigEndian, donc la relation d'ordre est la même que la comparaison d'octets individuels.
.
la source
Comparaison d'octets Java,
la source
Parce que ni
==
ni laequals()
méthode du tableau ne comparent le contenu; les deux n'évaluent que l'identité de l'objet (le fait==
toujours etequals()
n'est pas écrasé, donc la version deObject
est utilisée).Pour comparer le contenu, utilisez
Arrays.equals()
.la source
Vous pouvez également utiliser org.apache.commons.lang.ArrayUtils.isEquals ()
la source
Arrays.equals
ne suffit pas pour un comparateur, vous ne pouvez pas vérifier que la carte contient les données. Je copie le code depuisArrays.equals
, modifié pour créer un fichierComparator
.la source
Il existe un moyen plus rapide de le faire:
la source