Je ne comprends pas les détails particuliers du fonctionnement de la méthode CharBuffer
equals ()
.
Je ne comprends pas cette phrase "considérée indépendamment de leurs positions de départ": < / p>
Deux tampons de caractères sont égaux si et seulement si ,
Ils ont le même type d'élément,
Ils ont le même nombre d'éléments restants, et
Les deux séquences d'éléments restants, considérées indépendamment de leurs positions de départ sont égales par point.
J'étudie ces bons exemples - plus d'exemples a>, mais je ne comprends pas l'idée.
Quelqu'un pourrait-il expliquer avec des mots différents et avec un exemple de code perspicace minimal?
En particulier, je trouve cela étrange:
< pré> XXX3 Réponses :
Les CharBuffer
sont comparés en fonction de leur contenu restant . Cela signifie que la vérification equals ()
commence à partir de la position actuelle du tampon et non du début du tampon. Selon Buffer.position ()
:
La position d'un tampon est l'index du prochain élément à lire ou à écrire. La position d'un tampon n'est jamais négative et n'est jamais supérieure à sa limite.
Certaines méthodes comme put (char)
changeront la position du tampon:
CharBuffer cb1 = CharBuffer.allocate(10); cb1.put((char) 0); cb1.put((char) 0); cb1.put((char) 0); cb1.put((char) 0); cb1.put('a'); cb1.put('b'); // put(char) increments position so we need to rewind cb1.rewind(); CharBuffer cb2 = CharBuffer.allocate(10); cb2.put(4, 'a'); cb2.put(5, 'b'); System.out.println(cb1.equals(cb2)); // true, 0000ab0000 equals 0000ab0000
Dans votre exemple après cb1 .rewind ()
le premier tampon est ab00000000
tandis que le second tampon est 0000ab0000
. L'appel de cb2.rewind ()
n'est pas nécessaire car put (char, int)
ne change pas la position du tampon:
CharBuffer cb1 = CharBuffer.allocate(10); cb1.put('a'); // increments position cb1.put('b'); // increments position CharBuffer cb2 = CharBuffer.allocate(8); System.out.println(cb1.equals(cb2)); // true, 00000000 equals 00000000
Les deux séquences des éléments restants , considérés indépendamment de leurs positions de départ , sont égales en un point .
- En regardant uniquement les éléments restants,
- Sans considérer par où ils ont commencé,
- Chaque élément d'un tampon doit être égal à l ' élément correspondant de l'autre tampon.
Dans votre exemple, c'est la partie égale par point qui est importante:
0 1 2 3 4 5 6 7 8 9 cb1 = a b 0 0 0 0 0 0 0 0 cb1 = 0 0 0 0 a b 0 0 0 0Comme vous pouvez le voir, en comparant les éléments du tampon char point par point, ils ne correspondent pas.
Voici un exemple qui renvoie true
pour deux tampons de tailles différentes:
0 1 2 3 4 5 6 7 8 9 cb1 'x' 'x' 'a' 'b' 0 0 0 0 ^ cb2 0 0 0 0 'a' 'b' 0 0 0 0 ^
est égal à
compare les éléments aux positions 2 à 7 de cb1
aux éléments situés aux positions 4 à 9 de cb2
, et constate qu'ils sont égaux par paire (les deux contiennent les char
s suivants - 'a', 'b', 0,0,0,0).
Vous pouvez voir que la position de départ est différente dans les deux tampons (2 vs 4), mais les séquences de les éléments sont les mêmes.
CharBuffer cb1 = CharBuffer.allocate(8); cb1.put('x'); // moves the current position to 1 cb1.put('x'); // moves the current position to 2 cb1.put(2,'a'); cb1.put(3,'b'); System.out.print(cb1);System.out.println ('|'); CharBuffer cb2 = CharBuffer.allocate(10); cb2.get (); // moves the current position to 1 cb2.get (); // moves the current position to 2 cb2.get (); // moves the current position to 3 cb2.get (); // moves the current position to 4 cb2.put(4,'a'); cb2.put(5,'b'); System.out.print(cb2);System.out.println ('|'); System.out.println(cb1.equals(cb2));
Lorsque vous commencez à comparer les séquences à partir de la position de départ, vous obtenez deux séquences identiques.
Dans votre exemple, vous êtes comparaison de la séquence 0,0,0,0,0,0,0,0 (la séquence des éléments restants commence à la position 2) à la séquence 0,0,0,0, 'a', 'b', 0, 0,0,0 (la séquence des éléments restants commence à la position 0). De toute évidence, ils ne sont pas égaux les uns aux autres.