赞
踩
这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【什么是HashMap?什么情况下使用HashMap?】
大家好,我是IT修真院深圳分院第十一期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务十的一个知识点:什么是HashMap?什么情况下使用HashMap?
1.1 集合简介
在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的,如果我们需要保存一个可以动态增长的数据(在编译时无法确定具体的数量),java的集合类就是一个很好的设计方案了。
集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
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”依次读出。
HashMap和List的区别有哪些?
1、见编码实战
- 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())}
-
-
- }
CSDN、百度百科
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是线程安全的
腾讯视频:https://v.qq.com/x/page/s0738v8wzg3.html
PPT链接 视频链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。