Fragen zu Java-Sammlungsinterviews, Fragen zu Karteninterviews, Fragen zu Listeninterviews usw.





1. Über welche Schnittstellen verfügt das Java Collection Framework?

Liste, Set, Karte, Warteschlange, Deque

2. Was ist der Unterschied zwischen List Set Map Queue Deque?

  • List(Ein guter Helfer beim Umgang mit Ordnung): Elemente sind geordnet, wiederholbar und nullbar
  • Set(Konzentrieren Sie sich auf die Einzigartigkeit): Elemente sind ungeordnet, nicht wiederholbar und nullbar
  • Map(Experten, die Schlüssel zum Suchen verwenden): Elemente sind nicht in der richtigen Reihenfolge, nicht wiederholbar, Schlüssel darf nicht null sein, Wert kann null sein
  • Queue(wird verwendet, um die Verwendung von Warteschlangendatenstrukturen zu simulieren): Elemente sind geordnet, wiederholbar und nullbar
  • Deque(Doppelendige Warteschlange, die als Stapel und Warteschlange verwendet werden kann): Elemente sind geordnet, wiederholbar und nullbar

2.1 Was ist der Unterschied zwischen ArrayList (Array) und LinkedList (doppelt verknüpfte Liste)?

  • ArrayList: Der Innenraum wird über ein Array implementiert, unterstützt Direktzugriff, implementiert RandomAccessdie Schnittstelle, implementiert Serializabledie Schnittstelle, implementiert Cloneabledie Schnittstelle, Thread ist nicht sicher und weist eine hohe Effizienz auf
  • LinkedList: Der Innenraum wird über eine verknüpfte Liste implementiert, unterstützt keinen Direktzugriff, implementiert keine RandomAccessSchnittstelle, implementiert die SerializableSchnittstelle, implementiert Cloneabledie Schnittstelle, der Thread ist nicht sicher und die Effizienz ist hoch

2.1.1 Gründe für die Verwendung von ArrayList anstelle von LinkedList

  • Einfügung: Die Effizienz der ArrayList-Endeinfügung ist hoch und die Effizienz der LinkedList-Kopf- und -Endeinfügung ist hoch. Die Einfügungseffizienz ist jedoch sehr gering, da ArrayList Elemente verschieben muss und LinkedList Zeiger verschieben muss.
  • Löschen: Das Löschen des ArrayList-Endes ist effizient, und das Löschen des Kopfes und Endes von LinkedList ist effizient. Allerdings ist die Löscheffizienz in der Mitte sehr gering, da ArrayList Elemente verschieben muss und LinkedList Zeiger verschieben muss.
  • Änderung: Die Direktzugriffseffizienz von ArrayList ist hoch und die Direktzugriffseffizienz von LinkedList ist niedrig.
  • Abfrage: ArrayList hat eine hohe Direktzugriffseffizienz und LinkedList hat eine niedrige Direktzugriffseffizienz.
    Also verwenden wir einfach ArrayList.

2.2 Was ist der Unterschied zwischen HashMap und HashSet? (Hash-Tabelle Rot-Schwarz-Baum)

  • HashMap: Der Innenraum wird durch Array + verknüpfte Liste + rot-schwarzer Baum realisiert. Doppelte Elemente sind nicht zulässig, aber nur ein nullElement ist zulässig. Der Thread ist nicht sicher und die Effizienz ist hoch.
  • HashSet: Intern wird es HashMapimplementiert, es sind keine wiederholten Elemente zulässig, nur ein Element ist zulässig null, der Thread ist nicht sicher und die Effizienz ist hoch.

2.3 Was ist der Unterschied zwischen HashMap und Hashtable?

  • HashMap: Der Innenraum wird durch Array + verknüpfte Liste + rot-schwarzer Baum realisiert, es sind keine wiederholten Elemente zulässig, nur ein Element ist zulässig null, der Thread ist nicht sicher und die Effizienz ist hoch
  • Hashtable: Der Innenraum wird durch Array + verknüpfte Liste implementiert, es sind keine doppelten Elemente zulässig, keine nullElemente sind zulässig, Thread-sicher und geringe Effizienz

2.4 Was ist der Unterschied zwischen HashMap und ConcurrentHashMap?

  • HashMap: Der Innenraum wird durch Array + verknüpfte Liste + rot-schwarzer Baum realisiert, es sind keine wiederholten Elemente zulässig, nur ein Element ist zulässig null, der Thread ist nicht sicher und die Effizienz ist hoch
  • ConcurrentHashMap: Der Innenraum wird durch Array + verknüpfte Liste + rot-schwarzer Baum realisiert. Doppelte Elemente sind nicht zulässig und es sind keine nullElemente zulässig. Thread-Sicherheit und hohe Effizienz

2.5 Was ist der Unterschied zwischen HashMap und TreeMap?

  • HashMap: Der Innenraum wird durch Array + verknüpfte Liste + rot-schwarzer Baum realisiert, es sind keine wiederholten Elemente zulässig, nur ein Element ist zulässig null, der Thread ist nicht sicher und die Effizienz ist hoch
  • TreeMap: Der Innenraum wird durch einen rot-schwarzen Baum realisiert, es sind keine wiederholten Elemente erlaubt, keine nullElemente sind erlaubt, Threads sind nicht sicher und die Effizienz ist hoch. Elemente können sortiert werden. Implementiert über die SortedMap-Schnittstelle.

3. HashMap

  • Vor JDK1.8: Die verknüpfte Liste wird hauptsächlich zur Lösung von Hash-Konflikten verwendet (Zipper-Methode).
  • Nach JDK1.8: Wenn die Länge der verknüpften Liste größer als 8 ist, wird die verknüpfte Liste in einen Rot-Schwarz-Baum konvertiert (um die Abfrageeffizienz zu verbessern). Wenn die Länge des Arrays größer als 64 ist, wird die verknüpfte Liste in einen rot-schwarzen Baum umgewandelt, und wenn sie kleiner als 6 ist, wird der rot-schwarze Baum in eine verknüpfte Liste umgewandelt (um die Einfügungseffizienz zu verbessern). (Open Address Act)

3.1 Anfangskapazität und Auslastungsfaktor von HashMap

  • Anfangskapazität: Die Anfangskapazität von HashMap, dh die Kapazität der Hash-Tabelle beim Erstellen, der Standardwert ist 16.
  • Ladefaktor: Der Ladefaktor ist ein Wert zur Messung der Fülle der HashMap. Der Standardwert ist 0,75f, dh wenn die Anzahl der Elemente in der HashMap größer oder gleich dem Kapazität * Ladefaktor ist, beträgt die Kapazität erweitert.

3.2 Wie erweitert sich HashMap?

Wenn die Anzahl der Elemente in der HashMap größer oder gleich dem Kapazität * Lastfaktor ist, wird die Kapazität auf das Doppelte der ursprünglichen Kapazität erweitert.

3.3 Warum wird der Ausbau verdoppelt? Warum ist die Länge von HashMap eine Potenz von 2?

  • Um Hash-Kollisionen zu reduzieren und die Abfrageeffizienz zu verbessern.
  • Die Größe des Arrays entspricht einer Potenz von 2, sodass die Modulo-Operation in eine effizientere Bit-Operation umgewandelt werden kann.

3.4 Wie löst HashMap Hash-Konflikte?

Methode der verknüpften Liste (Zipper-Methode): Speichern Sie die verknüpfte Liste in einem Array. Wenn eine Hash-Kollision auftritt, speichern Sie die widersprüchlichen Elemente in der verknüpften Liste.
Offene Adressenmethode: Wenn eine Hash-Kollision auftritt, wird ein Algorithmus verwendet, um die nächste leere Hash-Adresse zu finden.

3.5 Wie bestimme ich die Position eines Elements in einem Array?

Berechnen Sie den Hash-Wert und die Modulo-Operation der Array-Länge mithilfe der hashCode()-Methode des Schlüssels, um die Position im Array zu erhalten.

public class AbstractHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V> {
    
    
    @Override
    public V put(final K key, final V value) {
    
    
        final Object convertedKey = convertKey(key);
        final int hashCode = hash(convertedKey);
        final int index = hashIndex(hashCode, data.length);
        HashEntry<K, V> entry = data[index];
        //...
        }

        addMapping(index, hashCode, key, value);
        return null;
    }

    protected int hashIndex(final int hashCode, final int dataSize) {
    
    
        return hashCode & dataSize - 1;
    }
}

3.6 HashMap HashSet, wenn Duplikat prüfen? Wie beurteilt man Gleichheit?

Ob sie gleich sind, wird anhand des HashCodes des Elements beurteilt, und ob sie gleich sind, wird anhand von Gleichen beurteilt.

public class AbstractHashMap<K, V> extends AbstractMap<K, V> implements Map<K, V> {
    
    
    @Override
    public V put(final K key, final V value) {
    
    
        //...
        while (entry != null) {
    
    
            if (entry.hashCode == hashCode && isEqualKey(convertedKey, entry.key)) {
    
    
                final V oldValue = entry.getValue();
                updateEntry(entry, value);
                return oldValue;
            }
            entry = entry.next;
        }
        //...
    }

    protected boolean isEqualKey(final Object key1, final Object key2) {
    
    
        return key1 == key2 || key1.equals(key2);
    }
}

3.7 Die Hash-Algorithmus-Störungsfunktion von HashMap. Warum ist JDK1.8 besser als der Hash-Algorithmus von JDK1.7?

Die Hash-Methode von JDK 1.8 ist einfacher als die von JDK 1.7, das Prinzip bleibt jedoch dasselbe.

    static final int hash(Object key) {
    
    
      int h;
      // key.hashCode():返回散列值也就是hashcode
      // ^:按位异或
      // >>>:无符号右移,忽略符号位,空位都以0补齐
      return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
  }

Vergleichen Sie den Quellcode der Hash-Methode von HashMap von JDK1.7.

static int hash(int h) {
    
    
    // This function ensures that hashCodes that differ only by
    // constant multiples at each bit position have a bounded
    // number of collisions (approximately 8 at default load factor).

    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

Im Vergleich zur Hash-Methode von JDK1.8 wird die Leistung der Hash-Methode von JDK 1.7 etwas schlechter sein, da sie immerhin viermal gestört wurde.

3.8 Das Problem der Multithread-Endlosschleife von hashMap

  • JDK1.7: Wenn mehrere Threads gleichzeitig Erweiterungsvorgänge ausführen, bildet die verknüpfte Liste eine Schleife und bildet eine Endlosschleife. Durch das Einfügen des Kopfes bildet die verknüpfte Liste eine Schleife.
  • JDK1.8: Wenn mehrere Threads gleichzeitig Erweiterungsvorgänge ausführen, bildet die verknüpfte Liste eine Schleife und bildet eine Endlosschleife. Die Tail-Insert-Methode führt nicht dazu, dass die verknüpfte Liste eine Schleife bildet.

4. ArrarList

4.1 ArrayList-Erweiterungsmechanismus

  • Die anfängliche Kapazität der ArrayList beträgt 10. Wenn die Anzahl der Elemente in der ArrayList größer oder gleich der Kapazität ist, wird die Kapazität auf das 1,5-fache der ursprünglichen Kapazität erweitert.






Meine Github-Adresse . Begrüßen Sie alle, die meinem Open-Source-Projekt beitreten möchten, oder (kontaktieren Sie mich auf meiner Homepage), um Ihrem Open-Source-Projekt beizutreten, und klicken Sie auf Github-Stars.

\ Name des Open-Source-Projekts abhängiger Typ Versionsnummer beschreiben
1 Spring-Boot-Starter-Versuch pom 1.0.0-SNAPSHOT Die Abfragegeschwindigkeit unter bestimmten Anforderungen übertrifft die von Open-Source-Suchtools bei weitem, und der B + -Baum unter innodb oder der invertierte Index in ES können nicht damit verglichen werden.
2 Spring-Boot-Starter-Versuch Krug 1.0.0-M1 Stellt SpringCloud-basierte Dienstknoten bereit, die für die Diensterkennung über die Nacos-Registrierung verwendet werden können und eine dynamische Erweiterung und Kontraktion des Baums sowie dynamische Online- und Offline-Dienste realisieren.
3 Datenanbieter pom 1.0.0-SNAPSHOT Es bietet Abfragen aus mehreren Datenquellen und die Synchronisierung von Datentypen. Als Jar kann es sich auf die dynamische Bereitstellung von Daten für andere Dienste verlassen.

Je suppose que tu aimes

Origine blog.csdn.net/jj89929665/article/details/130908738
conseillé
Classement