Java学习笔记(9):Map接口和常用方法(3)

Map接口实现类-Hashtable

Hashtable 的基本介绍

image-20210831200617908
  • 存放的元素是键值对:即 k-v
  • Hashtable 的键和值都不能为 null,否则会抛出NullPointerException
  • Hashtable 的使用方法基本上和 HashMap 一样
  • Hashtable 是线程安全的(synchronized),而 HashMap 是线程不安全
image-20210831201251105

简单分析底层

        Hashtable hashtable = new Hashtable();
        hashtable.put("john",100);
  • 底层有数组 Hashtable$Entry[] 初始化大小为11
  • 临界值 threshold 8 = 11 * 0.75
image-20210831202324320
扩容机制
  • 执行方法 addEntry(hash, key, value, index); 添加k-v 封装到Entry
  • 当 if (count >= threshold) 满足时,就进行扩容
  • 按照 int newCapacity = (oldCapacity << 1) + 1; 的大小扩容,即2倍+1
image-20210831210545209

与HashMap 的比较

版本线程安全(同步)效率允许null键null值
HashMap1.2不安全可以
Hashtable1.0安全较低不可以

Map接口实现类-Properties

Properties 的基本介绍

  • Properties 类继承自 Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存数据

image-20210831211457241

  • 它的使用特点和Hashtable类似
  • Properties 还可以用于 从xxx.properties 文件中,加载数据到 Properties类对象,并进行读取和修改
  • 说明:xxx.properties 文件通常作为配置文件

Map接口实现类-TreeMap

image-20210901105953381

代码演示以及源码分析

        TreeMap treeMap = new TreeMap();
        treeMap.put("HongKong","China");
        treeMap.put("Tokyo","Japan");
        treeMap.put("Boston","USA");
        treeMap.put("London","UK");

        System.out.println(treeMap);

运行结果:{Boston=USA, HongKong=China, London=UK, Tokyo=Japan}

提供一个构造器

		TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o2).compareTo((String)o1);
            }
        });

运行结果:{Tokyo=Japan, London=UK, HongKong=China, Boston=USA}

  1. 构造器把传入的实现了Comparator接口的匿名内部类(对象),传给TreeMap 的comparator
    public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
  1. 调用 put方法
  • 第一次添加,把k-v封装到 Entry对象,放入root
		Entry<K,V> t = root;
        if (t == null) {
            compare(key, key); // type (and possibly null) check

            root = new Entry<>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
  • 以后添加
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {//遍历所有的key,给当前key找到适当位置
                parent = t;
                cmp = cpr.compare(key, t.key);//动态绑定到匿名内部类的compare方法
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else//遍历过程中发现准备添加的 key 和当前已有的 key 相等就不添加
                    return t.setValue(value);
            } while (t != null);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值