Java集合框架:Map(HashMap、TreeMap)API

Map集合中存储元素对(键(key)值(value)对),每个键映射一个值,就像List的每个索引代表一个值一样,可以把List看作自带数值键的Map,但他们并没有什么联系。Map集合中存储的元素键(key)不能相同,但值(value)可以相同。不能储存基本数据类型(int等)。
Map的实现类有HashMap、TreeMap、LinkedHashMap等。

  1. HashMap:
    底层是一个数组结构(Node<K,V>[] table),数组中的每一项都是一个链表,HashMap是数组和链表的结合体。
    table是数组,数组的元素是Node,Node对象中有一个键(key)值(value)对用于存储元素,还有下一个Node对象的引用。
    数组中的每个Node元素同时也是当前Node链表的头节点,指向该链表的下一个节点。
    通过对键(key)进行hash(),得到hash值,找到在数组中的位置来访问或存储Node对象。
    非线程安全。
    在这里插入图片描述在这里插入图片描述

  2. TreeMap:
    TreeMap的存储结构是平衡二叉树,也叫红黑树,在数据的存储过程中可以自动对数据的键(key)进行排序,是一个有序的集合。
    默认的排序规则:按照键(key)的字典序来升序排序,也可以自定义规则(实现Comparator接口)。
    因为存储数据时需要排序,所以速度较慢。
    非线程安全。

  3. LinkedHashMap:
    封装了一下HashMap,多了一个链表结构,存储数据时按照先后排序。

LinkedHashMap<String, Integer> linkedHashMap =new LinkedHashMap<String, Integer>();
        HashMap<String, Integer> hashMap =new HashMap<String, Integer>();
        TreeMap<String, Integer> treeMap =new TreeMap<String, Integer>();
        linkedHashMap.put("A富强", 1); hashMap.put("A富强", 1); treeMap.put("A富强", 1);
        linkedHashMap.put("D和谐", 2); hashMap.put("D和谐", 2); treeMap.put("D和谐", 2);
        linkedHashMap.put("B民主", 3); hashMap.put("B民主", 3); treeMap.put("B民主", 3);
        linkedHashMap.put("C文明", 4); hashMap.put("C文明", 4); treeMap.put("C文明", 4);
        System.out.println("linkedHashMap输出:"+linkedHashMap);
        System.out.println("hashMap输出:"+hashMap);
        System.out.println("treeMap输出"+treeMap);

输出结果:在这里插入图片描述
通过结果得出:
LinkedHashMap输出和输入顺序一致。
HashMap为随机输出。
TreeMap为键(key)字典序升序输出。

API:

方法描述(HashMap、TreeMap通用)
V put(K key, V value)在集合中加入新元素,如果集合中已经有键(key),修改键对应的值,返回修改前的值
void putAll(Map<? extends K, ? extends V> m)在本集合中加入集合m中的所有元素
boolean isEmpty()判断集合是否为空
int size()返回集合中的键值对个数
void clear()将集合清空
Object clone()复制集合,返回复制体
V putIfAbsent(K key, V value)如果集合中键(key)不存在,在集合中加入新元素;如果键(key)存在,返回对应的值
V remove(Object key)删除集合中键为key的键值对,返回对应的值,如果键不存在,返回空
boolean remove(Object key, Object value)删除集合中对应的键值对
boolean containsKey(Object key)检查集合中对应的键是否存在
boolean containsValue(Object value)检查对应的值是否存在
V replace(K key, V value)将集合中key对应的值替换为value,返回被替换的值
V get(Object key)返回key对应的值
V getOrDefault(Object key, V defaultValue)返回key对应的值,如果没有,返回defaultValue
Set<Map.Entry<K,V>> entrySet()返回集合中所有的键值对的集合
Set< K> keySet()返回集合中所有的键的集合
Collection< V> values()返回集合中所有值的集合

HashMap和TreeMap如何选择

  1. HashMap可以实现快速存储和检索,缺点是存储的元素是无序的,适用于在Map中插入、删除和定位元素。
  2. TreeMap能便利的实现对内部元素的各种排序,但是一般性能比HashMap差,适用于按字典序或自定义顺序遍历键。

HashMap在jdk1.7和1.8的区别
在1.8中底层实现由之前的数组+链表改为 数组+链表+红黑树
当链表节点较少时仍以链表储存,当链表节点较多时(默认是大于8)会转为红黑树储存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值