Map接口

1.Map及其相关的导出类

JDK里Map的相关类
AbstractMap是JDK提供的实现Map借口的抽象类,Map的实现类基本都是继承该抽象类java.util.concurrent包的java的并发工具包。
java.util包的相关类:
Hashtable
AbstractMap
SortedMap
NavigableMap
HashMap
TreeMap
WeakHashMap
IdentityHashMap
LinkedHashMap

java.util.concurrent包的相关类:
ConcurrentMap
ConcurrentNavigableMap
ConcurrentHashMap

2.Map文档描述

Map接口取代Dictionary抽象类
Map提供三个集合视图:keySet(),values(),entrySet()
Map集合视图的排序即为Map内部元素排列顺序。TreeMap为排序提供保证,HashMap则没有。

将可变的对象用作key要当心,因为HashMap根据key的hashcode放置该条目,key发生变化,hashcode可能改变,造成map.get(key)根据hashcode找不到该条目。由于AbstractMap的hashcode是根据所有条目计算出来的,最好不要将自己当做key:
1.HashMap 在get(key)的时候,会计算key的hashcode,由于key是本身,而本身的hashcode又是由所有条目的key和value的hashcode计算得来,循环调用,会发生栈溢出StackOverflowError。但HashMap可以把自己当做value。
2.TreeMap 的key要实现Comparable接口,在插入map的时候,会调用compare()方法。而TreeMap本身没有实现这个接口,会报类型转换错误ClassCastException。
3.WeakHashMap虽然没有继承HashMap,但和HashMap一样,会发生StackOverflowError。
4.IdentityHashMap不会报错。

Map的实现类一般都会有一个默认构造器,和带一个map参数的构造器。前者会创建一个空Map,后者可用来复制map。这个建议没有强制保证(Map作为接口没有构造器),但JDK里面的Map实现类都遵从该规则。

集合框架接口里的一些方法依赖于equals方法,如containsKey(Object key) 方法,先比较hashcode 再去比较equals (Object.hashCode()保证两个不等的对象hashcode不相等)。

3.Map接口的方法

Map接口方法
从getOrDefault方法到最后,是Java8之后引入的,都是default关键字定义的方法,有具体实现。Java 8 为了支持lambda表达式,引入新的关键字default,default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。

4.Map内部接口 Entry< K,V >

Map.Entry接口方法
承载map条目(一对key和value)
有getkey(),getvalue(),setvalue(v)方法声明
euqals(object)返回key.equals(key)&&value.equals(value)
hashCode()返回key.hashcode()^value.hashcode().

静态方法comparingByKey(),comparingByValue(),该方法是jdk1.8引入的
comparing静态方法
(Comparator< Map.Entry< K, V >> & Serializable)是java 8新语法,表示同时满足两个类。
接口的静态方法不会被继承,只能通Map.Entry.comparingByKey()调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值