今天,我们来聊一聊HashMap,看看HashMap的源码是怎么样的?
HashMap包路径位于Java.util包中。我们跳过package语句和Import语句,从class的定义开始说起。
我们发现,它继承了AbstractMap类,且实现了三个接口,分别是Map接口,Cloneable接口和Serializable接口。
Serializable说明它可以被序列化,Cloneable说明其可复制,这两个接口均为标志接口,很简单,我们就不做介绍了。这里,我们先去看一下Map接口。
首先,Map接口是用泛型来定义的,我们知道,定义Map时,需要分别指明键和值的类型,那么,这里的泛型,就说明了键和值可以是任意一个类型,可以是JDK本身的,也可以是我们自定义的。
然后,就是定义了一些Map中规定的一些基本的方法,这些方法我们经常也会使用,就不一一介绍了。这里,要说的是,在这个Map接口里,还藏着一个Entry接口。
一个接口中定义另一个接口,我们称之为内部接口或者嵌套接口。这种方式我们好像并不是很常用或者常见,那么,我们就先来分析下,为什么这里要使用内部接口?
我们可以把内部接口和内部类作比较。我们知道,内部类是指在一个类的内部定义的另外一个类。内部类可以被认为是一个外部类内部定义的一个常规方法,这个方法可以是静态的,也可以是非静态的。静态内部类类似于静态方法,它只能访问外部类的静态成员属性,非静态方法可以访问外部类的所有成员属性。
那么,对于接口来说,因为接口是不能被实例化的,所以,如果一个内部接口是非静态的,那么,它是没有什么意义的。所以,默认情况下,内部接口是静态的,无论你是否手动加了static关键字。
好,说到这儿,你是不是发现更加懵逼了?不急,我们先搞清楚一个也许也是之前不常用也不曾思考过的问题,那就是,static修饰类或者接口的时候,有什么意义?</