写在前面
HashMap是一个散列表,可以用于储存数据,和C++的数组功能相似,但在Java中有很多类都能实现数组的功能,只是存取方式不同,排序方式不同。HashMap就是其中之一。
HashMap有以下特点:
- 存储键值对应的映射
- 实现Map接口,具有很快的访问速度
- 最多允许一条记录的键位null
- 不支持线程同步(在java多线程编程中,这一点尤为重要)
- 无序存储,不会记录插入的顺序
HashMap的存储内容
在上面我们给出了HashMap的存储内容的定义:HashMap存储键值对应的映射,实际上HashMap存储什么呢?存储两个值:key 和 value。
key和value是一组一一对应的数据,即一个key对应一个value。如:一个学号对应一个学生。
其中,key和value虽然存在一一对应的情况,但key和value的存储数据类型允许不相同。即我们可以用学号(Integer整型)做key,用成绩(Integer整型)做value,此时key与value类型相同。但我们也可以用学号(Integer整型)做key,用姓名(String字符串)做value,此时key与value类型并不相同。
这里需要说明的是,HashMap中的元素实际上是对象,即HashMap存储的是对象而非一个变量,所以HashMap实际上并不能存储 int,double 这些变量的,可以使用包装类将其封装成对象再放到HashMap中。
HashMap代码
先放出我在上Java课时的这部分内容的实验作业代码:
package exp4;
import java.util.*;
/**
*
* @author 苏三有春
* 编写HashMap
* 创建HashMap<Integer,String>对象,往里添加元素若干
* 分别用keySet()方法转成Set<Integer>
* 然后遍历Set<Integer>的方法
* 用entrySet()方法转成Set<Map.Entry<Integer,String>>
* 然后遍历Set<Map.Entry<Integer,String>>的方式遍历HashMap<Integer,String>
*/
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer,String > hashMapStudent=new HashMap<Integer,String>();
//向HashMap中添加元素
hashMapStudent.put(1, "susan1");
hashMapStudent.put(2, "susan2");
hashMapStudent.put(3, "susan3");
hashMapStudent.put(4, "susan4");
//尝试增加一个key,value相同的元素进去
hashMapStudent.put(3, "susan3");
//用keySet方法遍历
System.out.println("用keyset方法遍历hashMapStudent中的元素");
Set<Integer> keys = hashMapStudent.keySet();
for(Integer key : keys) {
System.out.println("编号:"+key+"姓名:"+hashMapStudent.get(key));
}
//尝试增加一个key相同,value不同的元素进去
hashMapStudent.put(3,"susan3*" );
//用entrySet()方法遍历
System.out.println("用entryset方法遍历hashMapStudent中的元素");
for(Map.Entry<Integer, String> key :hashMapStudent.entrySet()) {
System.out.println("编号:"+key.getKey()+"姓名:"+key.getValue());
}
}
}
下面对代码做一些解释:
HashMap<Integer,String> hashMapStudent=new HashMap<Integer,String>();
这一行代码是创建一个HashMap对象,该对象名为:hashMapStudent,用尖括号<>,表明该HashMap的key值类型与String值类型,注意,在这里,我们的key是整型,但用的是整型的包装类:Integer而非int,因为HashMap存放的是对象,我们必须把整型的数据封装成对象再装入其中。value是String,因String本身就是new出一个对象(若此处不懂,先记住,String类型的都是对象。)
hashMapStudent.put(1, "susan1");
这一行代码中调用了HashMap中的一个方法,即put()方法,这个方法就是我们用来将元素装入HashMap的一个方法,此处说明:添加一个key为1(Integer类型),value为"susan1"(String类型)的元素。
//用keySet方法遍历
System.out.println("用keyset方法遍历hashMapStudent中的元素");
Set<Integer> keys = hashMapStudent.keySet();
for(Integer key : keys) {
System.out.println("编号:"+key+"姓名:"+hashMapStudent.get(key));
}
这一段代码中调用了建立了一个Set对象,命名为keys,把hashMapStudent(即上面建立的一个HashMap的一个对象)中的key全部赋值给keys。
然后用增强型for循环遍历key,将key与key对应的value一个一个输出。
用get(key)方法,传入key参数,获取key对应的value。
这是其中的一种访问元素的方法。
//用entrySet()方法遍历
System.out.println("用entryset方法遍历hashMapStudent中的元素");
for(Map.Entry<Integer, String> key :hashMapStudent.entrySet()) {
System.out.println("编号:"+key.getKey()+"姓名:"+key.getValue());
}
这是另一种访问元素的方法,用entrySet()方法遍历。
entrySet()方法会返回映射中包含的映射的Set视图,Set视图就是HashMap中所有的键值都被看作是一个set集合。
我们在增强for循环中遍历这个set集合,通过这个视图的getKey()和getValue()方法来获取对应的key值和value值。
此外,下面附上这段代码运行后的输出:
用keyset方法遍历hashMapStudent中的元素
编号:1姓名:susan1
编号:2姓名:susan2
编号:3姓名:susan3
编号:4姓名:susan4
用entryset方法遍历hashMapStudent中的元素
编号:1姓名:susan1
编号:2姓名:susan2
编号:3姓名:susan3*
编号:4姓名:susan4
可以看到,若已经有一个元素为(3,susan3),则即使再加一个元素(3,susan3),HashMap也不会重复加入,但是若添加一个(3,susan3*),就会将HashMap中的key=3所对应的value更改成3*。
HashMap补充:
在上面的代码中,体现了HashMap的增,改,查,如果想删除HashMap中的元素,则可以使用:
hashMapStudent.remove(3);
使用remove(key)方法,将key=3的元素从hashMapStudent中删除。
清除所有元素使用:
hashMapStudent.clear();
如果要计算HashMap中的元素个数则可以使用:
count=hashMapStudent.size();
将hashMapStudent中的元素个数赋值给count。