> 文档中心 > JAVA学习day1——HashMap简介(含代码)

JAVA学习day1——HashMap简介(含代码)


写在前面

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对象,往里添加元素若干 * 分别用keySet()方法转成Set * 然后遍历Set的方法 * 用entrySet()方法转成Set<Map.Entry> * 然后遍历Set<Map.Entry>的方式遍历HashMap */public class HashMapTest {public static void main(String[] args) {HashMap hashMapStudent=new HashMap();//向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 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 key :hashMapStudent.entrySet()) {System.out.println("编号:"+key.getKey()+"姓名:"+key.getValue());}}}

下面对代码做一些解释:

HashMap hashMapStudent=new HashMap();

这一行代码是创建一个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 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 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。

松山湖网站