您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页Java中HashMap机制和原理个人总结

Java中HashMap机制和原理个人总结

来源:爱够旅游网

Java中HashMap机制和原理个人总结

原理:

图示:

  1. 链表形成的条件:1.hash值相等;2.不是同一对象;3.key不相等;4.key不为空。
  2. HashMapNode数组第一次扩容是16个大小Node,但是有一个加载因子0.75,具有临界值(threshold)16*0.75=12,当数组存储的元素到达12个节点时,就会自动扩容table数组为原来的2倍,临界值也会跟着扩容2倍。
  3. 如果一条链表的元素超过8个且table节点数组的大小>=个,这条链表就会进行树化,
    重点:如果一条链表元素超过8个,但是table节点数据的大小没到达个,这时候table就会进行resize(扩容)
    例:假如table此时为16个,一条链表超过8个,并再增加一个链表元素,第一次table扩容2倍,变成32个,这时候如果再增加一个链表元素,这时候table扩容2倍,变成个,这时候如果再增加一个链表元素,这次数组table不会再扩容,这时候这个链表就会变成红黑树(TreeNode),当这个红黑树删除节点至小于8个后,就会重新转化成链表,这个过程叫做剪枝。
链表红黑树树化过程代码举例:
public class Demo {

    public static void main(String[] args) {
        HashMap hashMap = new HashMap();


        //重复向数组中加入hash值相等,但对象不同的元素
        for (int i = 0; i <8 ; i++) {//同一节点位置形成一条8个长度的链表
            hashMap.put(new A("s"),100);
        }
        hashMap.put(new A("s"),100);//再增加同一节点,节点数组扩容至32个
        hashMap.put(new A("s"),100);//再增加同一节点,节点数组扩容至个
        hashMap.put(new A("s"),100);//再增加同一节点,这个链表转化成红黑树!
        System.out.println(hashMap);
    }
}


class A{

    private String name;

    public A(String name) {
        this.name = name;
    }


    @Override
    public int hashCode() {
        return 100;
    }
}
  1. HashMap遍历形式举例:
public class Demo {

    @SuppressWarnings("all")
    public static void main(String[] args) {

       //定义一个Map类
        Map haMa = new HashMap();
        haMa.put("no1","ssss");
        haMa.put("no4","swx");
        haMa.put("no8","gsdsd");
        haMa.put("no13","gsds");
        haMa.put("no1222","sddsg");

        //第一种遍历:利用Map.keySet
        Set set = haMa.keySet();
        //1.增强for
        for (Object key:set) {
            System.out.println(key + "-"+haMa.get(key));
        }
        System.out.println();
        //2.迭代器
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object key =  iterator.next();
            System.out.println(key + "-"+haMa.get(key));
        }

        System.out.println();
        //第二种遍历:利用Map.Values
        Collection v1 = haMa.values();
        //增强for
        for (Object value:
             v1) {
            System.out.println(value);
        }
        System.out.println();
        //迭代器
        Iterator iterator1 = v1.iterator();
        while (iterator1.hasNext()) {
            Object value =  iterator1.next();
            System.out.println(value);
        }
        System.out.println();

        //第三种遍历:map.entrySet()
        Set set1 = haMa.entrySet();

        //1.增强for
        //set1里面数据类型是entry,向上转型用Object接收
        for (Object entry:set1
             ) {
            //向下转型,用Map.Entry接收,就可以使用Map.Entry里面的方法
            Map.Entry en = (Map.Entry) entry;
            System.out.println(en.getKey()+"-"+en.getValue());

        }

        System.out.println();
        //2.迭代器
        Iterator iterator2 = set1.iterator();
        while (iterator2.hasNext()) {
            Object entry =  iterator2.next();
            //向下转型,用Map.Entry接收,就可以使用Map.Entry里面的方法
            Map.Entry en = (Map.Entry) entry;
            System.out.println(en.getKey()+"-"+en.getValue());
        }



    }
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务