一、教学目标
- 能够使用HashMap集合实现值为双列集合存放。
- 能够使用HashMap集合实现值为单列集合存放。
- 能够使用HashMap集合实现值为基本数据类型存放。
- 能够使用HashMap集合实现值为对象存放。
- ...
二、HashMap实现自定义元素存放
1、值存放基本数据类型
像这中就非常简单了呀,比如存放HashMap<String,Integer>,HashMap<Integer,String>,HashMap<Integer,Double>等双基本类型存储。
演示代码如下:
/*** 通过map.entrySet()方法遍历map*/@Testpublic void testMapByEntrySet() {//创建一个map集合容器Map<String, String> map = new HashMap<>();//添加元素map.put("黄忠", "射手");map.put("吕布", "战士");map.put("妲己", "法师");//获取所有的entry对象Set<Map.Entry<String, String>> entrySet = map.entrySet();//键值对方式遍历for (Map.Entry<String, String> entry : entrySet) {//解析entry对象String key = entry.getKey();String value = entry.getValue();System.out.println(key + "所对应的值为:" + value);}}
演示代码运行结果展示:
吕布所对应的值为:战士
妲己所对应的值为:法师
黄忠所对应的值为:射手
2、值存放对象。
对于HashMap<String,Object>,日常开发也经常会有的。其中Object对象可以是一个pojo类,一个实体Entity类等。比如我定义一个HashMap<String,UserEntity>,对于这种数据结构的map,我们来试试遍历,看看它是如何用的。
演示代码如下:
/*** 遍历值为对象的map集合*/@Testpublic void testMapForByObject() {//创建一个map集合容器Map<String, UserEntity> map = new HashMap<>();//添加元素map.put("1", new UserEntity(1, "赵云", 30));map.put("2", new UserEntity(2, "貂蝉", 10));map.put("3", new UserEntity(3, "李白", 20));map.put("4", new UserEntity(4, "黄忠", 60));//获取所有的entry对象Iterator<Map.Entry<String, UserEntity>> iterator = map.entrySet().iterator();//Iterator迭代器while (iterator.hasNext()) {Map.Entry<String, UserEntity> next = iterator.next();System.out.println(next.getKey() + "所对应的值为:" + next.getValue());}}
演示代码运行结果展示:
1所对应的值为:id=1 ,name=赵云 ,age=30
2所对应的值为:id=2 ,name=貂蝉 ,age=10
3所对应的值为:id=3 ,name=李白 ,age=20
4所对应的值为:id=4 ,name=黄忠 ,age=60
其中对于UserEntity对象,为何能打印其对象具体内容,因为我这是重写了toString(),像你们如果直接创建的对象且就这样直接进行对象遍历输出,next.getValue()所获取到的值且打印的出来的就是其对象的内存地址,所以如果你想具体打印其对象的内容,你们可以在你们所定义的实体类中重写toString方法即可。比如如下我的,仅供参考:
@Overridepublic String toString() {return "id=" + this.id + " ," + "name=" + this.name + " ," + "age=" + this.getAge();}
打印格式这个不固定的哈,你们根据自己的喜好随意定义,不用说就必须跟我的一样,这你们可明白,我一直教学的角度都是推崇学生发挥自主的想法去做去实现,而不是死板的只会按部就班,我也是会经常看些博主大佬写的文章,学习的只是人家写的思想,而不是连演示代码都敲一直,这样学出来的东西,就不是自己的,你这就等于在抄袭!我们要学的是代码思想,好不好。
演示代码已写好,那我们就来执行一下看看,给大家演示一下,如果我去掉对重写toString方法 。看看实际值打印会是啥?验证一下我上述说的结论对不对。
你们可以看到,值都是这种com.example.demo.entity.UserEntity@e0f2686,这就是打印的该对象的内存地址,至于为啥会打印内存地址,你们请看java.lang.Object类中toString的源码。我也不是凭空捏造,如下:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}
所以对于一些简单的源码,我们一定要培养自己的兴趣,去挖掘,比如就这个对象打印内容为何是一串字符串,而不是具体对象里头的内容,这就是一种专研,一种挖掘。像我们做开发,一定要培养自己的兴趣去深究代码原理。