这节我们学习一下HashMap(他也是线程不安全的) 它是存在于Map集合接口下面的一个具体实现类
HashMap依赖我们的Map接口 在用的时候一般不直接写HashMap而是通过Map来写
Map是以键值对形式存在的 支持泛型
代码如下(MyIndex)
image.png
运行结果
image.png
image.png
HashMap是一个数组和链表的合体 其内部有一个数组也有一个链表 同时处理我们的key和value
HashMap里面的键值对 key不可以重复 value可以重复 如果存在相同的key value不同则会覆盖第一个value值 而key保持不变(唯一)
代码如下(MyIndex)
image.png
运行结果
image.png
只会出现一次bhc 因为key相同
代码改变一下 key相同 value不同
image.png
运行结果
image.png
下面的覆盖了上面的
接下来学习一下如何获取键值
image.png
运行结果
image.png
接下来我们学习一下Set集合
image.png
我们从上图可以看见它下面的具体实现类 我们先看一下Hashset(其内部是基于HashMap实现的)
image.png
打印结果
image.png
我们能否加入一个对象让其不重复呢?仅仅加入字符串不刺激 这个对象可以是我们自定义的业务对象
为了模拟功能 我们创建一个类叫做Product 代表我们的商品
目录如下
image.png
代码如下
image.png
通过alt+insert生成 两个商品属性提前写好
然后修改MyIndex代码如下
image.png
运行结果
image.png
结果显示两次101_java book 并没有区分出来 表示无法区分两个是一致的
这是为什么呢?
我们来看下源码 hashset的 里面有个hashCode hashSet右面有个add方法 里面有put方法 下面有个hash方法 里面有hashcode
hashCode是通过一定的算法计算出的散列值 在putVal函数中判断了key是否存在,如果存在,则进行覆盖
所以接下来我们需要对Product进行是否重复的判断
因为如果我们在set集合中传入的是字符串可以比对出值是否相等 但是传入一个对象是无法对比值是否相等的
image.png
但是如果想比较加入自定义对象怎么办呢?
这时候需要重写equals方法和hashcode方法
然后系统才可以判断我们的这两个对象是否相等
Product里面代码如下
image.png
由于我们重写了上面的两个方法 并对对象是否相等进行了业务上的处理
运行结果如下
image.png
可以看出就不会加入key值一样的数据了
hashcode的作用还可以用于后台数据库中新闻标题和内容进行重复判断 我们可以返回一个int行的hash值加上标题和内容组合而成的hash值判断是否重复
网友评论