学习笔记043——HashMap源码学习1

1、HashMap

HashMap key 是不能重复的,value 可以重复

底层结构 key-value 进行存储,key-value 存入到 Set 中,再将 Set 装载到 HashMap

在这里插入图片描述

package com.htl;

import java.util.*;

public class HashMapTest {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("h", "Hello");
        hashMap.put("w", "World");
        hashMap.put("j", "Java");
        System.out.println(hashMap);
        System.out.println("***********************************");
        //map有3种遍历方式
        //1、获取Set(包含kv)
        Set set = hashMap.entrySet();
        Iterator<Map.Entry> iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry next = iterator.next();
            System.out.println(next.getKey()+"------------"+next.getValue());
        }
        System.out.println("****************************************");
        //2、获取key所在的set集合
        Set keySet = hashMap.keySet();
        Iterator iterator1 = keySet.iterator();
        while (iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }
        System.out.println("****************************************");
        //3、获取value所在的Collection集合
        Collection values = hashMap.values();
        Iterator iterator2 = values.iterator();
        while (iterator2.hasNext()) {
            System.out.println(iterator2.next());
        }
    }
}

2、Hashtable

用法和 HashMap 一致,区别在于 Hashtable 是较早推出的一个类,是线程安全的,效率低。

在这里插入图片描述

HashMap 是线程不安全的,效率高。

在这里插入图片描述

3、TreeMap

TreeMap 中存储有序的元素,存入的元素会自动进行排序,按照 key 值进行升序排列。

package com.htl;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest {
    public static void main(String[] args) {
        TreeMap treeMap = new TreeMap();
        treeMap.put(3, "Java");
        treeMap.put(5, "JavaME");
        treeMap.put(1,"Hello");
        treeMap.put(6, "JavaEE");
        treeMap.put(2, "World");
        treeMap.put(4, "JavaSE");
        Set keySet = treeMap.keySet();
        Iterator iterator = keySet.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next + "---" + treeMap.get(next));
        }
    }
}
package com.htl;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest {
    public static void main(String[] args) {
        TreeMap treeMap = new TreeMap();
        treeMap.put(new C(1), "Java");
        treeMap.put(new C(2), "JavaME");
        treeMap.put(new C(3),"Hello");
        treeMap.put(new C(4), "JavaEE");
        treeMap.put(new C(5), "World");
        treeMap.put(new C(6), "Big");
        treeMap.put(new C(7), "JavaSE");
        Set keySet = treeMap.keySet();
        Iterator iterator = keySet.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next + "---" + treeMap.get(next));
        }
    }
}

class C implements Comparable{
    private int num;

    public C(int num) {
        this.num = num;
    }

    /**
     * A.compareTo(B)
     * 1 A>B
     * 0 A=B
     * -1 A<B
     * @param o
     * @return
     */
    @Override
    public int compareTo(Object o) {
        C c = (C) o;
        if(this.num > c.num) return -1;
        if(this.num == c.num) return 0;
        if(this.num < c.num) return 1;
        return 0;
    }

    @Override
    public String toString() {
        return "C{" +
                "num=" + num +
                '}';
    }
}

4、HashMap 底层结构

HashMap 底层其实是一个数组,成为哈希桶,JDK 1.7 和 JDK 1.8 底层结构是不同的。

JDK 1.7:数组+链表

JDK 1.8:数组+链表+红黑树

在这里插入图片描述

4.1、什么是红黑树?

红黑树是一个平衡二叉树

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

在这里插入图片描述

在这里插入图片描述

红黑树

1、结点是红色或者黑色

2、根节点是黑色的

3、每个叶子节点都是空节点

4、每个红色节点的两个子节点都是黑色的

5、从任一节点到它的每个叶子节点的所有路径都包含相同数目的黑色节点

哈希冲突:key 所映射的 hash 一样

HashMap 源码

从构造器入手来看

在这里插入图片描述

并没有创建数组,而是给加载因子赋值 = 0.75,加载因子是用来完成数组扩容的。

只有在添加数据的时候才会创建数组,HashMap 是懒加载的形式。

在这里插入图片描述

在这里插入图片描述

DEFAULT_INITIAL_CAPACITY 就是数组的初始化长度,16,哈希桶默认的长度为 16

数组长度为 16,存入多少个元素的时候,需要进行数组扩容呢?

16 * 0.75 = 12,每次扩容是给数组长度乘以 2,16 --> 32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值