目录
1、模型
2、常用方法
(1) HashMap
(2)HashSet
3、HashMap和HashSet最大的区别
我们一般把搜索的数据称为关键字(key),和关键字对应的称为值(value):
(1) 纯key模型:
比如,快速查找某个人的名字是否存在于通讯录中,这个人的名字就是关键字key.
(2) key-value模型:
比如,统计一段话中,每种标点符号出现了多少次,其中,每个标点符号就是关键字key,它所出现的次数就是对应的值value.
HashMap就是key-value模型。
HashSet中只存储了key。
关于Map.Entry
查看Map接口的原码可以发现,Entry是其内部的一个接口,
HashMap既然实现了Map接口,那它也必然实现了Entry接口,
可以看到,在HashMap的内部类Node中实现了Entry接口,该内部类主要提供了key,value的获取以及设置value的方法,但是并没有设置key的方法.
注意:
(1) HashMap中存放键值对的key是唯一的,value是可以重复的.
(2) HashMap中的key可以全部分离出来,存储到Set中来访问(因为key不能重复),即keySet()方法.
(HashMap中的key并没有进行排序,上图代码中打印的结果是所有的key在哈希表中存放的顺序)
(3) HashMap中的value也可以全部分离出来,存储在Collection中(value可能有重复),即 values()方法.
(HashMap中的value也没有进行排序,value的顺序和key的存放顺序有关)
(4) HashMap中的key不能直接修改,如果要修改key,需要把key先删除再重新插入,value可以直接修改.
(5) entrySet()方法的使用:
entrySet()方法就是把HashMap中的每个键值对打包成一个整体,然后放入到一个集合中:
注意:
(1) HashSet中只存储了key,并且key不会重复,使用HashSet可以达到去重的效果。因为HashSet的底层是HashMap:
查看HashSet源码时,可以发现它的每个构造方法都会初始化一个HashMap:
LinkedHashMap是在HashSet的基础上维护了一个双向链表来记录元素的插入顺序,本质上还是个HashMap。
而HashSet底层HashMap的每个value都是一个空的Object类型的对象:
(2) HashSet中的key不能修改,如果要修改,需要先删除再重新插入.
(3) HashMap和HashSet的key和value都可以存放null.
二者最大的区别就在于,HashSet是继承自Collection的接口类,Set中只存储key。
HashMap是继承于Map接口,存储的是key-value键值对。