Map (映射)一 一对应的关系 一对一、一对多

Map 是一种把键对象和值对象进行关联的容器, 而一个值对象又可以是一个Map, 依次类推,这样就可形成一个多级映射。

想想学习英语使用的词典软件,输入英文(key)后,软件会显示出对应的中文(value)。Map就是在内存中的这种结构。

Key(键):

  1. 和 set— 样,键对象不允许重复,这是为了保持查找结果的一致性。 如果有两个键对象一样, 那你想得到那个键对象所对应的值对象时就有问题了。
  2. 在使用过程中某个键所对应的值对象可能会发生变化, 这时会按照最后一次修改的值对象与键对应(就是key同一个key有多次值绑定,最后一个就会覆盖之前的)
  3. 可以使用 null 作为 Key

Value(值):

  1. 值对象没有唯一性的要求, 你可以将任意多个键都映射到一个值对象上, 这不会发生任何问题( 不过对使用却可能会造成不便, 你不知道你得到的到底是那一个键所对应的值对象,所以请不要这样做)
  2. 可以使用 null 作为 Value

Map 有两种比较常用的实现: HashMap 和 TreeMap

常用的方法

方法名 说明
put(key , value) 储存数据
get(key) 通过key得到值
remove(key) 通过key删除对应的值(key当然也会删除)
entrySet() 获取Map所有的Key,返回一个Set集合
values() 获取Map所有的value,返回一个List 集合
containsKey(key) 判断Map中是否有输入的参数:key
containsValue(value) 判断Map中是否有输入的参数:value
size() 判断Map中数据的总数
clear() 清空Map中所有的数据
isEmpty() 判断Map中是否有数据

HashMap

HashMap 用到了哈希码的算法, 以便快速查找一个键。

public static void main(String[] args) {

    HashMap<String, String> zsInfo = new HashMap<>();

    zsInfo.put("name", "张三");
    zsInfo.put("height", "173CM");
    zsInfo.put("sex", "男性");

    for (Map.Entry<String, String> info : zsInfo.entrySet()) {
        System.out.println( info );
    }
}
负载因子,当容量使用到75%时,触发扩容的操作
DEFAULT_LOAD_FACTOR  = 0.75    负载因子 = 0.75
DEFAULT_INITIAL_CAPACITY = 16  默认的初始化容量=16,必须是2的整数次幂,原因是便于Hash运算,提高效率
TREEIFY_THRESHOLD = 8  树化_阈值 = 8  当长度大于8时,链表的查询会变慢,优化为树

TreeMap

TreeMap 是对键按序存放, 因此它便有一些扩展的方法, 比如 firstKey() 、lastKey() 等, 可以从TreeMap 中指定一个范围以取得其子Map

public static void main(String[] args) {

    TreeMap<String, String> tree = new TreeMap<>();

    tree.put("name", "Jack");
    tree.put("age", "22");
    tree.put("身高", "173");
    tree.put("sex", "man");
    tree.put("体重", "70KG");

    System.out.println("-------------------");
    for (Map.Entry<String, String> entry : tree.entrySet()) {
        System.out.println( entry );
    }
    System.out.println("-------------------");

    System.out.println("firstKey = "+ tree.firstKey());
    System.out.println("firstEntry = "+ tree.firstEntry());
    System.out.println("lastKey = "+ tree.lastKey());
    System.out.println("lastEntry = "+ tree.lastEntry());

}

树:红黑树

性质1. 结点是红色或黑色。
性质2. 根结点是黑色。
性质3. 所有叶子都是黑色。(叶子是NIL结点)
性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
性质5. 从任一节结点其每个叶子的所有路径都包含相同数目的黑色结点。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Map接口 Map是 一个键值对的集合。也就是说,一个映射不能包含重复的键,每个键最多映射到一个值。该接口取代了D...
    wame100阅读 4,132评论 0 0
  • 一、当两个对象的 hashCode 相同会发生什么? 因为 hashCode 相同,不一定就是相等的(equals...
    Djbfifjd阅读 4,021评论 1 11
  • Map接口 概述:1.Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映...
    jadefly阅读 2,635评论 0 0
  • Map 我们都知道 Map 是键值对关系的集合,并且键唯一,键一对一对应值。 关于 Map 的定义,大概就这些吧,...
    Anonymous___阅读 3,785评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,728评论 28 53