这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【什么是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 () {
ListuserList = ()List list = ArrayList()User user = User()list.add()list.add()list.add(user)list.add(userList)list} ()
User (){
User()}List
() {
ListuserList = 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和treeMap8.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免费指导。
更多内容,可以加入IT交流群565734203与大家一起讨论交流
这里是技能树·IT修真院:,初学者转行到互联网的聚集地
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。