java集合框架-Map

Map接口

Map是存储双列数据的集合。存放的数据无序,key不可重复,value可重复。
首先介绍一下Map的常用抽象方法:

方法类型方法名及说明
Vput(K key, V value) 将指定的值与该映射中的指定键相关联
voidputAll(Map<? extends K,? extends V> m) 将指定地图的所有映射复制到此映射。
booleancontainsKey(Object key) 、containsValue(Object value) 如果此映射包含指定键的映射或有键映射到指定的值,则返回 true 。
voidclear() 删除地图中所有映射。
booleanequals(Object o)将指定的对象与此映射进行比较。
inthashCode()返回此地图的哈希值。
booleanisEmpty()如果此地图不包含键值映射,则返回 true 。
Vremove(Object key) 如果存在,从该地图中删除一个键的映射。
Set<Map.Entry<K,V>>entrySet() 返回此地图中包含的映射的Set视图。
intsize()返回此地图中键值映射的数量。
Collection< V >values() 返回此地图中包含的值的Collection视图。
Set< K >keySet() 返回此地图中包含的键的Set视图。
Vget(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。

如果put了已存在的的key,则会修改对应key的value。

HashMap实现类

底层在JDK7之前是数组+链表;JDK8之后是数组+链表+红黑树,线程不安全,效率高。

可以存储null的key和value

HashMap objects = new HashMap<>();
objects.put(null,null);
System.out.println(objects);//{null=null}

(JDK7之前)new HashMap<>();在实例化以后,底层创建一长度为16的一维数组Entry[].
put(key,value)首先调用key所在类的hashCode()计算key的哈希值,经过某种算法计算后得到entry数组中的存放位置,如果位置上的数据为空,则添加成功;如果位置上的数据不为空,比较key和已存在数据的key。此时的添加为头插法,有导致成环的可能。扩容则是扩容为原来的2倍。
成环问题参考

(JDK8之后)new HashMap()时底层没有创建长度为16的Node数组,首次调用put时才创建数组。当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8,数组长度 > 64,则此索引位置上的所有数据改为红黑树存储;如果链表形式 > 8,数组长度 < 64,则进行数组扩容。加载因子0.75,扩容的临界值=容量*加载因子。

LinkedHashMap实现类

继承HashMap,保证遍历时按照添加的顺序遍历,在HashMap的基础上添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,效率高于HashMap。

static class Entry<K,V> extends HashMap.Node<K,V> {
    Entry<K,V> before, after;
    Entry(int hash, K key, V value, Node<K,V> next) {
        super(hash, key, value, next);
    }
}

TreeMap实现类

底层使用红黑树,可以根据key排序。
1.无参构造器,会自动排序,可通过实现Comparable接口(如果compareTo()返回0会导致判断为重复数据)。

public TreeMap() {
        comparator = null;
    }

2.创建一个Comparator对象传入TreeSet的带参构造器中进行排序。

public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }

此文仅为学习记录之用,若有不足,欢迎指正,会随后续学习更改不足之处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值