zoukankan      html  css  js  c++  java
  • java学习day15--API-Map-->HashMap

    Map(接口)

    java.util.MapMap是一个接口, 一般使用的是Key-Value键值对的形式存储数据, 且key不能重复,如果重复值会被覆盖

    类型参数: K - 此映射所维护的键的类型V - 映射值的类型。

    特点:

    • 可以根据键 提取对应的值
    • key键不允许重复,如果重复值会被覆盖
    • 存放的都是无序数据
    • 初始容量是16,默认的加载因子是0.75

    注意事项:

    • 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值。
    • 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常.
    • 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常。
    • 当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。
    • 当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异常。

    关系图:

    Map关系图

    常用方法:

    返回值 方法 说明
    V put(K key, V value) 添加键值对, 并返回value+
    V get(Object key) 根据key获取指定的value
    void clear(); 清空Map所有的键值对
    V remove(Object key) 删除指定的键值对并返回其value
    boolean isEmpty() 是否为空
    int size() 键值对的个数
    boolean containsKey(Object key) 是否包含指定key
    boolean containsKey(Object key) 是否包含指定的Value
    boolean equals(Object obj) 比较和其他Map是否相等
    int hashCode() 获取Map在内存中对应的哈希值
    Collection values(); 把map中所有的value存到一个集合中并返回这个集合
    Set keySet() 把Map中的所有key存到一个Set集合中, 并返回. 参见: keySet()实例
    Set<Map.Entry<K, V>> entrySet() 把Map中的所有键值对(Entry对象)存入Set集合. 参见: entrySet()实例

    遍历方式

    keySet()实例:

    // 定义map...
    Set<Integer> set = map.keySet();
    for (Integer i : set) {
        System.out.println(i);
    }
    

    entrySet()实例:

    java.util.Map.Entry是一个键值对对象, 可以使用getKey()getValue()获取key和value

    // 定义map...
    Set<Entry<Integer, String>> set2 = map.entrySet();
    for (Entry<Integer, String> entry : set2) {
        System.out.println(entry.getKey() + " : " + entry.getValue());
    }
    

    HashMap(实现类)

    HashMap的键要同时重写hashCode()和equals().

    基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。

    特点: 无序, key不能重复

    原理

    HashMap底层是一个Entry数组(默认大小为16),当存放数据时会根据hash算法计算数据的存放位置。算法:hash(key)%n,n就是数组的长度。

    当计算的位置没有数据时,就直接存放,当计算的位置有数据时也就是发生hash冲突的时候/hash碰撞时,采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。

    这使得HashMap的查询效率非常高

    实现原理图:

    HashMap实现原理图

    Entry数组的初始容量是16. 加载因子是0.75(上限率). 当map中的元素>16*0.75时, 会进行扩容

    常用构造

    方法 说明
    HashMap<K, V>() 无参构造(K和V均为泛型)

    常用方法(Map接口中的方法)

    Map<K, V>

    返回值 方法 说明
    V put(K key, V value) 添加键值对, 并返回value+
    V get(Object key) 根据key获取指定的value
    void clear(); 清空Map所有的键值对
    V remove(Object key) 删除指定的键值对并返回其value
    boolean isEmpty() 是否为空
    int size() 键值对的个数
    boolean containsKey(Object key) 是否包含指定key
    boolean containsKey(Object key) 是否包含指定的Value
    boolean equals(Object obj) 比较和其他Map是否相等
    int hashCode() 获取Map在内存中对应的哈希值
    Collection values(); 把map中所有的value存到一个集合中并返回这个集合
    Set keySet() 把Map中的所有key存到一个Set集合中, 并返回.
    参见: keySet()实例
    Set<Map.Entry<K, V>> entrySet() 把Map中的所有键值对(Entry对象)存入Set集合.
    参见: entrySet()实例
  • 相关阅读:
    web.xml中<web-app>报错
    groovy初体验:groovy在java中的应用
    Mac安装JMeter时Unable to access jarfile ./ApacheJMeter.jar 解决方法
    intellij idea中解决java.lang.VerifyError: Expecting a stackmap frame at branch target的方法
    关于go get无法安装国内被墙软件解决办法
    Oracle 序列
    无锁并发框架Disruptor学习入门
    vsftp服务器部署
    FinalShell 推荐
    supperset (python 2.7.12 + mysql)记录
  • 原文地址:https://www.cnblogs.com/liqbk/p/12931221.html
Copyright © 2011-2022 走看看