1.HashMap概述
(1)首先HashMap是基于哈希表的Map接口实现的。另外HashMap中存储的数据是按照键值跟键值对的关系来进行存储的。
(2)不同于ArrayList方法的是,ArrayList中的每个元素都是有序的,既然有序,那么每个元素都有它所对应的index。当我们想要查找元素时,就可以通过元素的index来进行查询。但是如果数据量庞大,我们想要从中取出一个或者几个元素的时候,那么就需要整个List遍历找出要取的index,这样就需要花费很长的时间而且耗资源效率不高效。而HashMap在这点上就大大减少了查找的负担。只需要通过查找key的方式就可以找到要查找对象的key和value。不用key跟value都去找它的index。
(3)HashMap中key,value是成对出现的,一个key对应一个value。key唯一。
(4)HashMap的key允许是null,但是null的情况只能1个。一般出现null都是出现bug的情况才会有,不推荐把key设置成null。
(5)HashMap无序。
2. HashMap的创建(添加)
注释:HashMap的创建跟其他类的创建以及ArrayList的方法创建是一样的都是通过new一个对象的方式创建。
而这里顺便强调一点的是.put(key, value);方法既是追加也是更改。如果list中没有该元素那么追加这个元素,如果list中已经含有这个元素那么就更改这个元素的值(因为key相同所以更改的都是value的内容)
package com.java.demo_9;
import java.util.HashMap;
public class HashTest1 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("tony", "13962349564");
map.put("kevin","18615479975");
map.put("Vivian","15948759694");
System.out.println(map); //直接输出内容
System.out.println("====================================================");
String result =(String)map.get("tony"); //通过.get方法查找对应的value
System.out.println(result);
System.out.println("====================================================");
/**
* 编例HashMap中所有key跟value的值
*/
for(Object key:map.keySet()){
String value = (String) map.get(key);
System.out.println(key+":"+value);
}
}
}
结果:
(1){Vivian=15948759694, tony=13962349564, kevin=18615479975} 注释:直接打印
====================================================
(2)13962349564 注释:获取的是指定key的value
====================================================
(3)通过for循环遍历后的结果。(输出HashMap中所有key与value)
Vivian:15948759694
tony:13962349564
kevin:18615479975
3. HashMap的修改
注释:上面已经说过了。.put的方法即是添加也是修改。它没有update方法,所以当要修改一个元素的时候首先一定要先判断这个元素是否存在于hashmap中然后再修改。不然一旦没有该元素,那么put就实现了添加的作用。
package com.java.demo_9;
import java.util.HashMap;
public class HashTest1 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("tony", "13962349564");
map.put("kevin","18615479975");
map.put("Vivian","15948759694");
System.out.println("====================================================");
/**
* 编例HashMap中所有key跟value的值
*/
for(Object key:map.keySet()){
String value = (String) map.get(key);
System.out.println(key+":"+value);
}
System.out.println("====================================================");
/**
* 修改
*/<br> System.out.println(map.containsKey("Vivian")); //通过containsKey()方法做判断如果list中包含查找key,返回值为true.
map.put("Vivian", "888888888");
for(Object key:map.keySet()){
String value = (String) map.get(key);
System.out.println(key+":"+value);
}
}
}
结果:通过下面的输出结果可以看出Vivian的数据已经被替换掉了。所以.put在这里的方法起到了变更的作用并不是追加。但是建议在更改key前无论是通过if,else还是其他方法都要对目前hashmap中的元素做一个对比或者说查找是否有该元素。如果没有直接put就不是变更了变成了追加。这点一定要注意。
【修改前数据】
Vivian:15948759694
tony:13962349564
kevin:18615479975
====================================================
【判断是否包含查找key的返回值】
true
【修改后数据】
Vivian:888888888
tony:13962349564
kevin:18615479975
4. HashMap的删除
注释: HashMap中有.remove()方法。可以直接通过这种方法删除要删除元素。
package com.java.demo_9;
import java.util.HashMap;
public class HashTest1 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("tony", "13962349564");
map.put("kevin","18615479975");
map.put("Vivian","15948759694");
System.out.println("====================================================");
/**
* 编例HashMap中所有key跟value的值
*/
for(Object key:map.keySet()){
String value = (String) map.get(key);
System.out.println(key+":"+value);
}
System.out.println("====================================================");
map.remove("Vivian");
for(Object key:map.keySet()){
String value = (String) map.get(key);
System.out.println(key+":"+value);
}
}
}
结果:
【修改前】
Vivian:15948759694
tony:13962349564
kevin:18615479975
====================================================
【修改后】
tony:13962349564
kevin:18615479975
5. HashMap的查找【面向对象】
注释:对于HashMap的查找其实没有什么太大的意义。因为在HashMap中我们要查的是key,key是唯一的所以只要知道了key就能把对应的value一并查找出来。而查询一个字典中是否存在。通过上面的.containsKey(key))的方法也可以直接得到true,false的结果。因此关于查找我们不单一介绍。结合复杂案例再一并来看HashMap的查找。下面分享一个通过创建一个student类,并且根据student类中的studentName来查找的案例。
Student类
HashMapTest(测试类)
结果:因为代码中运用了Scanner从键盘输出的方法,所以在下列“请输入查找的学员名称:”后的学生名是手动通过键盘输入进去的。输出完毕后会发现已经从列表中找到了我们要查找的对象。相反如果输入的学员姓名不包含在列表中。那么反馈的结果就是“对不起,无此人信息!”。
【反馈结果1】
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<学员信息一览表>
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
王小天:学员名称:王小天, 学员编号:cn0001, 班级番号:class0001
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入查找的学员名称:武则天
学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
【反馈结果2】
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<学员信息一览表>
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
王小天:学员名称:王小天, 学员编号:cn0001, 班级番号:class0001
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入查找的学员名称:茨木童子
对不起,无此人信息.
注释:通过上例可以看出当一个字典,或者说一个列表中的元素非常多的时候,我们不能通过肉眼马上查找出我们要查询的对象。那么通过HashMap键值对查找的方式就很方便的查到我们要查找的对象了。
6. 【面向对象】HashMap的修改(结合Student类的案例来进行修改)
注释:HashMap中对于修改一个字典中的元素用的是上述所说的.put方法。如果该元素存在的情况下就修改,不存在的情况下添加。而下面这个结合Student类来进行修改的案例其实是通过调用Student类中getter,setter封装中.set的方法来进行修改的。一起来看一下代码。
HashMapTest(面向对象修改)
结果:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<学员信息一览表>
屠龙刀:学员名称:屠龙刀, 学员编号:cn0005, 班级番号:class0006
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
王小天:学员名称:王小天, 学员编号:cn0001, 班级番号:class0001
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入查找的学员名称:王小天
学员名称:王小天, 学员编号:cn0001, 班级番号:class0001
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入修改学员的学员编号:88888888
屠龙刀:学员名称:屠龙刀, 学员编号:cn0005, 班级番号:class0006
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
王小天:学员名称:王小天, 学员编号:88888888, 班级番号:class0001
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
注释:
对于变更而言。首先你应该先找到你要变更的那个键值对才可以。因此查询是不可缺少的步骤。当查到我们要修改的值时,再通过.set方法来进行变更。这里我们要变更的是“学员编号”。因此再次通过Scanner键盘输入要更改的学员编号,最后重新遍历出来更改后的结果。
(这里需要注意的是.set变更完后,一定要重新.put进HashMap 字典中去。不然原来的字典内容不会做任何的改变。这点一定要注意。另外HashMap中不推荐修改主键(key)。修改的都是value)
7. 【面向对象】HashMap的删除(结合Student类的案例来进行删除)
注释:查询,修改在上述的代码中已经呈现了。那么接下来就是删除跟添加了。首先来看删除。对于删除还是直接使用HashMap中.remove的方法。因为是删除所以在这里我没有做查找,直接做的删除。(当然不嫌麻烦的话你也可以加上查找。)
HashMapTest(面向对象删除)
结果:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<学员信息一览表>
屠龙刀:学员名称:屠龙刀, 学员编号:cn0005, 班级番号:class0006
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
王小天:学员名称:王小天, 学员编号:cn0001, 班级番号:class0001
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入要开除的学员名称:王小天
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
屠龙刀:学员名称:屠龙刀, 学员编号:cn0005, 班级番号:class0006
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
8. 【面向对象】HashMap的追加(结合Student类的案例来进行追加)
注释:最后来看一下面对对象方面的追加。(因为HashMap字典已经存在要想追加我们还是通过Scanner键盘输入的方式进行追加。那么问题来了,value的话在Student类中有3个参数。所以当我们追加的时候也同时需要通过键盘的方式输入3次不同的参数后,方可输入到原HashMap字典中。参数多的情况下不建议这种方法添加。)那么一起来看一下下面的代码吧。
HashMapTest(面向对象追加)
结果:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<学员信息一览表>
屠龙刀:学员名称:屠龙刀, 学员编号:cn0005, 班级番号:class0006
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
王小天:学员名称:王小天, 学员编号:cn0001, 班级番号:class0001
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入追加的学员名称:三胖
请输入追加的学员的学员编号:9999999
请输入追加的学员的教室:class0001
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
三胖:学员名称:三胖, 学员编号:9999999, 班级番号:class0001
屠龙刀:学员名称:屠龙刀, 学员编号:cn0005, 班级番号:class0006
张天爱:学员名称:张天爱, 学员编号:cn0002, 班级番号:class0002
小钢炮:学员名称:小钢炮, 学员编号:cn0004, 班级番号:class0005
王小天:学员名称:王小天, 学员编号:cn0001, 班级番号:class0001
武则天:学员名称:武则天, 学员编号:cn0003, 班级番号:class0003