Heim  >  Artikel  >  Verwendung von Byte-Arrays als Map-Schlüssel

Verwendung von Byte-Arrays als Map-Schlüssel

王林
王林nach vorne
2024-02-08 23:51:301062Durchsuche

In PHP ist die Verwendung von Byte-Arrays als Map-Schlüssel eine effiziente Methode, die die Leistung und Speichernutzung Ihres Programms verbessern kann. Byte-Arrays als Schlüssel haben schnellere Zugriffsgeschwindigkeiten und weniger Speicherverbrauch als Zeichenfolgen als Schlüssel. Durch die Verwendung von Byte-Arrays als Schlüssel können Sie insbesondere bei der Verarbeitung großer Datenmengen effektiv Speicherplatz sparen. Darüber hinaus können Byte-Arrays flexiblere Schlüsselnamenoperationen bereitstellen, z. B. Größenvergleich, Abfangen und Spleißen usw. Alles in allem ist die Verwendung von Byte-Arrays als Map-Schlüssel eine nützliche Technik in der PHP-Entwicklung, die die Programmleistung und -effizienz verbessern kann.

Frageninhalt

Haben Sie Probleme bei der Verwendung von Byte-Arrays als Map-Schlüssel? Ich könnte auch new String(byte[]) und einen Hash über String erstellen, aber die Verwendung von String 执行 new String(byte[]) 和哈希,但使用 byte[] 更直接。

解决方法

问题在于 byte[]equalshashcode ist einfacher.

Workaroundhashmap

Das Problem besteht darin,
    Objektbezeichner für equals und hashcode zu verwenden, also
  1. byte[] b1 = {1, 2, 3}
    byte[] b2 = {1, 2, 3}
    string stimmt nicht mit
  2. überein. Ich sehe drei Möglichkeiten:
  3. listdf12804343f5520ff3af5d9f86b34817
  4. ist in
  5. eingeschlossen, aber Sie müssen bei Codierungsproblemen vorsichtig sein (Sie müssen sicherstellen, dass Byte -> String -> Byte die gleichen Bytes ergibt). hashcodeequals
  6. Verwenden Sie
(größerer Speicherverbrauch).

Schreiben Sie Ihre eigene Wrapper-Klasse und schreiben Sie

, um den Inhalt des Byte-Arrays zu verbrauchen.

Solange Sie nur möchten, dass die Referenzen der Schlüssel gleich sind, ist das in Ordnung – Arrays implementieren „Wertegleichheit“ nicht auf die Art und Weise, wie Sie es vielleicht möchten. Zum Beispiel:

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());
Drucken Sie etwa so:
false
1671711
11394033
byte[] (Die tatsächlichen Zahlen spielen keine Rolle; die Tatsache, dass sie unterschiedlich sind, schon.)

Angenommen, Sie bytearraywrapper 作为 hashmap (等)中的键后更改字节数组中的值,您将在再次查找该键时遇到问题...您可以在如果您愿意,可以使用 bytearraywrapper tatsächlich wollen Gleichheit, empfehle ich Ihnen, einen eigenen Wrapper zu erstellen, der enthält und Gleichheit und Hash-Code-Generierung entsprechend implementiert:

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);
    }
}

Bitte beachten Sie, dass Sie Probleme haben werden, den Schlüssel wieder zu finden, wenn Sie den Wert im Byte-Array ändern, nachdem Sie bytearraywrapper als Schlüssel in bytebuffer (特别是它的 bytebuffer#wrap(byte[]) 方法)。我不知道这是否真的是正确的事情,因为 bytebuffer (usw.) verwendet haben ... Sie können dies in You tun Sie können den Konstruktor bytearraywrapper verwenden, wenn Sie möchten, aber das ist offensichtlich eine Leistungsverschwendung, wenn Sie wissen, dass Sie den Inhalt des Byte-Arrays nicht ändern werden.

🎜EDIT: Wie in den Kommentaren erwähnt, können Sie 🎜s auch mit allen zusätzlichen Funktionen verwenden, die Sie nicht benötigen, aber es ist eine Option. 🎜

Das obige ist der detaillierte Inhalt vonVerwendung von Byte-Arrays als Map-Schlüssel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:RESTful-Trigger-FunktionNächster Artikel:RESTful-Trigger-Funktion