Eine der Cloud- und Dateninterviewfragen, HASHMAP, wird ausführlich erläutert

Interviewfragen zur JAVA-Serie

Merkmale

1. Hochfrequenzinterviews

2. Bemühen Sie sich, tiefgründig zu sein

3. Nah am Unternehmen

4. Iterative Upgrades

1.HashMap-Datenstruktur

Fragen zu Grundfertigkeiten, Schwierigkeitsindex: 1 Stern;

1.7 Array + verknüpfte Liste;

1.8 Array + verknüpfte Liste + rot-schwarzer Baum

2. Was passiert, wenn der HashCode zweier Objekte gleich ist?

Grundkenntnisse: Schwierigkeitsindex: 1 Stern

Es kann konsistent oder inkonsistent sein. Ein weiterer Punkt, der beurteilt werden muss, ist die Konsistenz des Inhalts.

In der Datenstruktur von HashMap haben die gespeicherten Elemente denselben HashCode. Wenn der Inhalt konsistent ist, kann er nicht demselben HashMap-Objekt hinzugefügt werden. Andernfalls ist der Inhalt inkonsistent und nach dieser Struktur wird es zu einem verknüpften Listenformat.

3. Wie hoch ist die Anfangskapazität?

Grundkenntnisse: Schwierigkeitsindex: 1 Stern

16:DEFAULT_INITIAL_CAPACITY = 1 << 4;

4. Wann verwandelt sich eine verknüpfte Liste in einen rot-schwarzen Baum?

Grundkenntnisse, Schwierigkeitsindex: 2 Sterne

Die erste ist die Speicherstruktur des HashMap-Arrays. Wenn hashCode () in Konflikt gerät und die Länge ausreichend ist, wird es zu einem verknüpften Listenformat.

Zweitens: Länge》=8, wenn die Mindestkapazität 64 beträgt, wird daraus ein rot-schwarzer Baum.

5. Wie kann die Kapazität dynamisch erweitert werden?

Grundkenntnisse, Schwierigkeitsindex: 2 Sterne

Belastungsfaktor: Belastungsfaktor, abgeleitet aus der mathematischen „Poisson-Verteilung“. 0,75

Im Falle einer Erweiterung: Kapazitätsauslastungsfaktor = 16,75 = 12, d. h. wenn die Array-Länge und die Anzahl der Speicherelemente 12 überschreiten, beginnt die Erweiterung. Bei der Erweiterung des Arrays wird diese direkt verdoppelt. 16*2=32. 2-fache Kapazität.

Einzelheiten finden Sie im Code.

6. Wie kann man 1024 Elemente auf einmal einstellen, ohne die Kapazität zu erweitern?

Schwierigkeitsgrad: 3 Sterne-4 Sterne

Untersuchen Sie Wissenspunkte: Grundkenntnisse von HashMap.

Legen Sie eine Anfangskapazität fest, die den Schwellenwertbereich überschreitet: Anfangskapazität*0,75>1024

Hier wird das offizielle Plug-in von Oracle verwendet

<!--Oracle官方提供的 JAVA微基准测试套件-->
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.36</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.36</version>
            <scope>provided</scope>
        </dependency>

Java-Code-Tests

@BenchmarkMode(Mode.AverageTime)                                        // 测试完成时间
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.SECONDS)          // 预热 2 轮,每次 1s
@Measurement(iterations = 5, time = 3, timeUnit = TimeUnit.SECONDS)     // 测试 5 轮,每次 3s
@Fork(1)                                                                // fork 1 个线程
@State(Scope.Thread)                                                    // 每个测试线程一个实例
public class AliQuestion{
    
    
    public static void main(String[] args) throws RunnerException {
    
    
        // 启动基准测试
        Options opt = new OptionsBuilder()
                .include(AliQuestion.class.getSimpleName()) // 要导入的测试类
                .build();
        new Runner(opt).run(); // 执行测试
    }

    @Benchmark
    public void noSizeTest(Blackhole blackhole) {
    
    
        Map map = new HashMap();
        for (int i = 0; i < 1024; i++) {
    
    
            map.put(i, i);
        }
        // 为了避免 JIT 忽略未被使用的结果
        blackhole.consume(map);
    }

    @Benchmark
    public void setSizeTest(Blackhole blackhole) {
    
    
        Map map = new HashMap(1367);
        for (int i = 0; i < 1024; i++) {
    
    
            map.put(i, i);
        }
        // 为了避免 JIT 忽略未被使用的结果
        blackhole.consume(map);
    }
}

Effizienzvergleich

Fügen Sie hier eine Bildbeschreibung ein

/ Um zu verhindern, dass JIT ungenutzte Ergebnisse ignoriert
blackhole.consume(map);
}
}


效率对比

[外链图片转存中...(img-a1XmfcEK-1703595611311)]

Guess you like

Origin blog.csdn.net/zhangchen124/article/details/135231337