什么是HashMap?什么情况下使用HashMap?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/84333872

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

什么是HashMap?什么情况下使用HashMap?

大家好,我是IT修真院深圳分院第十一期学员,一枚正直纯洁善良的JAVA程序员。

今天给大家分享一下,修真院官网JAVA任务十的一个知识点:什么是HashMap?什么情况下使用HashMap?

1    背景介绍
1.1    集合简介

在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的,如果我们需要保存一个可以动态增长的数据(在编译时无法确定具体的数量),java的集合类就是一个很好的设计方案了。
集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
2    知识剖析
2.1    什么是HashMap?

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
2.2    HashMap有哪些构造函数
HashMap共包括4个构造函数
public HashMap()// 默认构造函数
public HashMap(int initialCapacity, float loadFactor) / /指定“容量大小”和“加载因子”的构造函数
public HashMap(int initialCapacity) // 指定“容量大小”的构造函数
public HashMap(Map<? extends K, ? extends V> m) // 包含“子Map”的构造函数,将m中的全部元素逐个添加到HashMap中

2.3    HashMap主要的对外接口有哪些?
clear():清空HashMap。它是通过将所有的元素设为null来实现的;
containsKey():判断HashMap是否包含key;
containsValue():判断HashMap是否包含“值为value”的元素;
entrySet()、values()、keySet():返回“HashMap中所有对应的集合”,它是一个集合;
get():获取key对应的value;
put():对外提供接口,让HashMap对象可以通过put()将“key-value”添加到HashMap中;
putAll():将"m"的全部元素都添加到HashMap中;
remove():删除“键为key”元素。
2.4    HashMap还实现其他哪些接口?
Cloneable接口:克隆一个HashMap对象并返回;
Serializable接口:分别实现了串行读取、写入功能。
串行写入函数是writeObject(),它的作用是将HashMap的“总的容量,实际容量,所有的Entry”都写入到输出流中。
而串行读取函数是readObject(),它的作用是将HashMap的“总的容量,实际容量,所有的Entry”依次读出。
3    常见问题
HashMap和List的区别有哪些?
4    解决方案
1、见编码实战
5    编码实战

com.example.demo.controllercom.example.demo.pojo.Userorg.junit.Testorg.springframework.web.bind.annotation.org.springframework.web.bind.annotation.java.util.ArrayListjava.util.HashMapjava.util.Listjava.util.MapHiController {
    ()
    Map () {
        User user = User()Map map = HashMap()map.put()map.put()map.put(user)map.put(())map}


    ()
    List () {
        List<User> userList = ()List list = ArrayList()User user = User()list.add()list.add()list.add(user)list.add(userList)list}

    ()
    User (){
        User()}

    List<User> () {
        List<User> userList = ArrayList()(i = i < i++) {
            User user = User(+ i+ i)userList.add(user)}
        userList}

    @Test
    () {
        System..println(getMap().get())System..println(getList().get())}


}

6    扩展思考

7    参考文献
CSDN、百度百科
8    更多讨论
8.1    Map集合还有哪些实现类?

HashMap、Hashtable和treeMap
8.2    HashMap和Hashtable的相同点
 HashMap和Hashtable都是存储“键值对(key-value)”的散列表,而且都是采用拉链法实现的。
存储的思想都是:通过table数组存储,数组的每一个元素都是一个Entry;而一个Entry就是一个单向链表,Entry链表中的每一个节点就保存了key-value键值对数据。
添加key-value键值对:首先,根据key值计算出哈希值,再计算出数组索引(即,该key-value在table中的索引)。然后,根据数组索引找到Entry(即,单向链表),再遍历单向链表,将key和链表中的每一个节点的key进行对比。若key已经存在Entry链表中,则用该value值取代旧的value值;若key不存在Entry链表中,则新建一个key-value节点,并将该节点插入Entry链表的表头位置。
删除key-value键值对:删除键值对,相比于“添加键值对”来说,简单很多。首先,还是根据key计算出哈希值,再计算出数组索引(即,该key-value在table中的索引)。然后,根据索引找出Entry(即,单向链表)。若节点key-value存在与链表Entry中,则删除链表中的节点即可。
8.3    HashMap和Hashtable的不同点
数组默认大小不一样 hashMap(16) hashtable(11)
构造方法传int 如:
HashMap map = new HashMap(31)   开辟的空间是32  取的是临界 2的n次方
Hashtable hashTable = new Hashtable(31) 开辟的空间是31
HashMap key 可以为空 HashTable key不能为空(抛出空指针异常)
hashmap的空间达到数组大小*因子(默认0.75)时,开辟的空间是原来的2倍,hashtable是2倍+1
hashmap是非线程安全的,hashtable是线程安全的

技能树.IT修真院   

  “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

   这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。

快来与我一起学习吧~http://www.jnshu.com/login/1/24864700

腾讯视频:https://v.qq.com/x/page/s0738v8wzg3.html

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/84333872