Maison  >  Article  >  Utilisation de tableaux d'octets comme clés de carte

Utilisation de tableaux d'octets comme clés de carte

王林
王林avant
2024-02-08 23:51:301015parcourir

En PHP, utiliser des tableaux d'octets comme clés de carte est une méthode efficace qui peut améliorer les performances et l'utilisation de la mémoire de votre programme. Les tableaux d'octets en tant que clés ont des vitesses d'accès plus rapides et une consommation de mémoire inférieure à celle des chaînes en tant que clés. En utilisant des tableaux d'octets comme clés, vous pouvez économiser efficacement de l'espace mémoire, en particulier lorsque vous traitez de grandes quantités de données. De plus, les tableaux d'octets peuvent également fournir des opérations de nom de clé plus flexibles, telles que la comparaison de taille, l'interception et l'épissage, etc. Dans l’ensemble, l’utilisation de tableaux d’octets comme clés de carte est une technique utile dans le développement PHP qui peut améliorer les performances et l’efficacité du programme.

Contenu de la question

Rencontrez-vous des problèmes lors de l'utilisation de tableaux d'octets comme clés de carte ? Je pourrais aussi faire du new String(byte[]) et du hachage via String, mais utiliser String 执行 new String(byte[]) 和哈希,但使用 byte[] 更直接。

解决方法

问题在于 byte[]equalshashcode est plus simple.

Solution de contournementhashmap

Le problème est
    d'utiliser des identifiants d'objet pour equals et hashcode, donc
  1. byte[] b1 = {1, 2, 3}
    byte[] b2 = {1, 2, 3}
    string ne correspond pas à
  2. . Je vois trois options :
  3. listdf12804343f5520ff3af5d9f86b34817
  4. est enveloppé dans
  5. , mais vous devez faire attention aux problèmes d'encodage (vous devez vous assurer que byte -> string -> byte vous donne les mêmes octets). hashcodeequals
  6. Utilisez
(consommation de mémoire plus importante).

Écrivez votre propre classe wrapper et écrivez

pour consommer le contenu du tableau d'octets.

Tant que vous voulez que seules les références des clés soient égales, ce n'est pas un problème - les tableaux n'implémentent pas "l'égalité des valeurs" comme vous pourriez le souhaiter. Par exemple :

byte[] array1 = new byte[1];
byte[] array2 = new byte[1];

system.out.println(array1.equals(array2));
system.out.println(array1.hashcode());
system.out.println(array2.hashcode());
Imprimez quelque chose comme ceci :
false
1671711
11394033
byte[] (Les chiffres réels n'ont pas d'importance ; le fait qu'ils soient différents importe.)

En supposant que vous bytearraywrapper 作为 hashmap (等)中的键后更改字节数组中的值,您将在再次查找该键时遇到问题...您可以在如果您愿意,可以使用 bytearraywrapper réellement voulez l'égalité, je vous recommande de créer votre propre wrapper qui contient et implémente l'égalité et la génération de code de hachage de manière appropriée :

public final class ByteArrayWrapper
{
    private final byte[] data;

    public ByteArrayWrapper(byte[] data)
    {
        if (data == null)
        {
            throw new NullPointerException();
        }
        this.data = data;
    }

    @Override
    public boolean equals(Object other)
    {
        if (!(other instanceof ByteArrayWrapper))
        {
            return false;
        }
        return Arrays.equals(data, ((ByteArrayWrapper)other).data);
    }

    @Override
    public int hashCode()
    {
        return Arrays.hashCode(data);
    }
}

Veuillez noter que si vous modifiez la valeur dans le tableau d'octets après avoir utilisé bytearraywrapper comme clé dans bytebuffer (特别是它的 bytebuffer#wrap(byte[]) 方法)。我不知道这是否真的是正确的事情,因为 bytebuffer (etc.), vous aurez du mal à retrouver la clé... Vous pouvez le faire dans You Vous pouvez utiliser le constructeur bytearraywrapper si vous le souhaitez, mais c'est évidemment un gaspillage de performances si vous savez que vous ne modifierez pas le contenu du tableau d'octets.

🎜EDIT : Comme mentionné dans les commentaires, vous pouvez également utiliser les 🎜 avec toutes les fonctionnalités supplémentaires dont vous n'avez pas besoin, mais c'est une option. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer