• HashMap的简易解读


    特点

    1. HashMap是存储key-value形式的集合对象
    2. HashMap初始容量为16,且容量必须是2的幂。
    3. HashMap存储的key不能重复,可以存储null为key或者value,也不能重复
    4. HashMap由数组+链表组成,jdk1.8后链表长度大于8用红黑树增加查询数据
    5. HashMap是线程不安全的,Hashtable的函数都是同步的,这意味着它是线程安全的。
    6. 虽然使用Entry组成数组是有序的,当时由于加入了链表和红黑树,所以HashMap是无序的

    HashMap的四个构造方法

    空参构造

    • 负载因子是指当存储容量到达实际容量的多少了开始扩容,默认为0.75,也就是说初始容量为16,达到16*0.75的容量时候就开始扩容
    public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // 负载因子
    }
    

    自定义初始容量的构造

    • 这个调用了下面一个构造
    public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    

    自定义初始容量和负载因子的构造

    • >>>是移位运算符,和>><<不同的是,在使用该运算符的时候高位用0填充,而其他两个用的是符号填充
    • |=是指or运算符,并赋值,和+=*=表示行业相同,|表示在二进制中运算
    • 原码:数字原本的二进制字节码,最高位的标识符号位,0标识正数,1表示负数
    • 反码:正数的反码是其本身,负数的反码是符号位不变,其他位取反
    • 补码:正数的补码是其本身,负数的补码是在反码的基础上+1
    public HashMap(int initialCapacity, float loadFactor) {
        //判断初始容量不能小于0
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                                initialCapacity);
        //初始容量不能大于最大值,否则就等于最大值                                        
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        //负载因子不能小于0,并且不能为null
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                                loadFactor);
        this.loadFactor = loadFactor;
        //由于HashMap容量必须大于16且为2的n次方,所以需要对传入的容量大小进行格式化,例如传入10,这需要设置为16
        this.threshold = tableSizeFor(initialCapacity);
    }
    
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }
    

    初始数据的构造

    • 泛型标识介绍:
      • E - Element (在集合中使用,因为集合中存放的是元素)
      • T - Type(Java 类)
      • K - Key(键)
      • V - Value(值)
      • N - Number(数值类型)
      • ?- 表示不确定的java类型
    • 表示传入的类型上限为K的类型,也就是说必须为K的子类
    • 表示传入的类型下限为K的类型,也就是说必须为K的父类
    public HashMap(Map<? extends K, ? extends V> m) {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        putMapEntries(m, false);
    }
    
  • 相关阅读:
    B. Gerald is into Art
    day 56 Django介绍
    day 55 bootstrap应用
    Python学习之变量的作用域
    day 54 JQ用法
    day 53 BOM与DOM
    day 52 js语法
    day 51 label标签,文字属性,背景属性,边框,display属性,盒模型,浮动,overflow,定位,z-index和模态框
    day 50 form表单,input框,textarea,select,css的引入方式,标签嵌套,选择器,宽高属性,字体属性
    day 49 html标签介绍,标题、段落、a、img、表格、特殊符号、常用标签、div、span
  • 原文地址:https://www.cnblogs.com/Juaoie/p/13225284.html
Copyright © 2020-2023  润新知