集合!对!!这就是最细致的Java集合(Map)学习总结③---Java学习总结
????????????:【java集合Set学习总结】
????????????:【Java集合 List学习总结】
Map
- Map中的数据是以键值对(key-value)的形式存储的
- 键值对:比如登录系统的时的登录界面。需要用户名(userName)和密码,用户名对应的值是“Kilig”。那么此时
就是一个键值对。
- key-value是以Entry类型的对象实例存在的
- 可以通过key值快速的查找value的值
- 一个映射不可包含重复的键值。key的值必须为1,否则在数据查找时会找到多个相同的值,很恐怖。但是value值可以对应多个key值。
HashMap
- 基于哈希表的Map接口实现
- 允许使用null值和null键,只能有一个为空的键
- key值是不可以重复的
- HashMap中的entry对象是无序排列的
同样让我们打开JavaAPI文档看一看????????????:点击打开Java API文档
接口Map:我们可以看到,Map有一个静态的接口,在常用方法中,有清空的方法,取得对应vale的值,还有Set<Map,Entry<K,V>>获取键值对所有的内容。
此外在HashMap中我们添加新值得方法变为put(k, v);
HashMap实现类:可以看到在HashMap中,我们的构造方法和HashSet是很类似的。大多使用的是默认的方法。
常用方法也和Map接口的很类似。
案例练习1
完成一个字典的功能
- 将单词以及单词的注释存储到HashMap中,单词和注释就构成了一个键值对
- 显示HashMap中干的内容,并且查找某个单词的注释并且线束出来
1.首先我们在eclipse的工程文件的com.kilig.list包下创建一个DictionaryDemo的类。然后完成对象字典的创建
2.紧接着我们创造一个while循环,让用户输入单词和注释。
3.打印输出value的值,在这儿我们使用迭代器来进行。
【注意】我们在这儿先调用这个集合的values的集合,然后在调用集合的迭代器方法,把值存入迭代器中。然后进行循环
4.让我们输出看一看!!
5.那么如果不仅想打印key值也要打印value值怎么做呢 ?
在这儿我们就需要用到HashMap提供的entrySet() 的方法,他将HashMap中的键值对都放在一个集合中,这样我们就可以遍历集合,然后取出所有的数据。
其中我们使用的是增强型for循环
案例练习2
- 使用hashMap对商品的信息进行管理,把商品存储到HashMap
- key值W为商品的编号,value为商品的对象
- 并且实现在HashMap中的商品信息进行增删改查等的操作
分析:
- 商品信息的属性:商品编号(id),商品名称(name),商品价格(price)
- 所会可能使用到的方法:构造方法(对属性进行赋值),获取和设置属性值得方法,其他的方法
1.首先打开eclipse,然后在com.kilig.list的包下创建商品信息类Goods。然后完成基本属性和构造方法的操作(在第一部分list的案例有举例哦!)
2.在com.kilig.list包下定义一个商品的测试类,名字名为GoodsTest。
并且定义用户输入的对象。因为在我们的商品信息中,key要求唯一,而且只有商品的编号是唯一的,所以我们把key--用id代替。而value--用商品信息类。
3.编写输入商品的信息操作,
其实当商品信息输入之后,我们需要将商品的信息组合成一个商品对象,然后添加到HashMap中。
在Map中的添加方法是put,而且key值为商品的id---price,value就是商品这个属性
4.遍历输出。我们使用迭代器来进行打印输出。
可以看到,我们成功的输出了结果。
【思考】我们知道,商品的编号是不可以重复的,那么假如管理员在输入商品的编号一样时会发生什么情况呢?
可以看到,当输入商品的编号(key)一样厚,输出的商品信息就减少了一个。就特别像我们之前在HashSet中很像。因为HashMap是不允许重复的,所以相同的key值在插入时。只取了一次。
而且可以看到在处理相同key值时,会保留最后一个重复的key值。
【升级】:我们增加一个判断商品重复的功能
5.再输入商品编时就需要进行判断。在这儿我们用到的就是containsKey的方法,他就是进行key值判断的方式
如果中间出现重复编号,我们是希望跳出当前的,而不是结束全部的,在这儿我们就用到continue;
测试一下!
可以看到,当我们你输入重复的信息时,程序跳出当前的循环,然后重新执行。
【思考????】:如果商家输错了价格,没有按照规定的输入double时会发生什么呢?让我们来看看
可以看到,发生了输入字符不匹配的异常报错,(关于异常的总结我在前面正好刚发出去!!真是太巧了哈哈哈。直接上连接????????????:常见异常的总结)try-catch
运行一下
我去,这是什么鬼,怎么会直接跳出前两个再继续往下运行呢,先在往下看看。。。
我草,为什么输出来结果是这个呢?看看才发现,我们输入的上一条错误的价格,显示到当前的商品编号上了。。。
原来是当这个输入异常报错后,当我们从写输入数据后其实调用的是下一个netInt()的方法,所以数据是给了下一个数据的。
【解决】:使用in.next() 让程序多写一个,将错误的输入数据放到异常中,不会顶入下一轮
可以看到很细微的差别,我们的输入跳到了第一个上
【总结】
在这个集合阶段,总结了ArrayList,HashSet,HashMap,三个集合的方法。
此外,还学会了Iterator(迭代器)接口,hashCode的使用
哈希表的原理