Java HashMap总结
本文将对HashMap做比较全面的总结,一个是从概念上理解,第二个是HashMap的使用,这里使用HashMap基本上是键值对来操作使用,
那这个跟泛型有没有关系呢?我理解的话是有关系的,前面我们使用的泛型是一个类型的如:List<String>list,但是HashMap里面的泛型居然是两个类型的东西,HashMap<String,String>map;使用过就知道HashMap把<String,String>的数据封装在Entry这个泛型接口的类里面,实际原理可能不是这样的,但是可以这样理解。
一.HashMap是什么?
HashMap 和 HashSet 是 JavaCollection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类。
虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 HashMap 来实现的。
具体的概念也不用理解太多,知道HashMap使用键值对来存储数据就可以了。
二.HashMap常用的使用方法
HashMap的方法并不多,学会增删改查就可以
(一)public intsize();
返回此列表中的元素数。
(二) public boolean isEmpty();
如果此列表中没有元素,则返回 true
(三)public void clear()
从此映射中移除所有映射关系。
(四)public void put(K key, V value)
在此映射中关联指定值与指定键。。
(五)public void remove(Object key)
从此映射中移除指定键的映射关系(如果存在)。
三.MashMap增删改查基本操作
示例一
package com.xykj.map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
public class MainClass {
/**
* HashMap的增删改查操作
* 使用迭代器使用时要用Entry接口
* */
public static void main(String[] args) {
//实例化一个HashMap对象
HashMap< String,String>hashMap=new HashMap<>();
//增加,这里乱序添加,看结果是不是乱序的!
hashMap.put("a","libai");
hashMap.put("d","lishiming");
hashMap.put("z","lihongzhang");
hashMap.put("b","lijiacheng");
//删除key为“4”的元素。删除时,key和value都要匹配上否则是不会删除成功的
//hashMap.remove("b", "lishiming");
//使用一个参数的方法,注意参数是key的值,HashMap没有游标这个说法
hashMap.remove("b");
//修改 3的value换成liwenzhi
hashMap.put("z", "liwenzhi");
//用迭代器查看,其他方法好像都是不行的,因为这个相当于层层封装的东西了
Iterator
> it=hashMap.entrySet().iterator();
while (it.hasNext()) {
//这里Entry是个接口
Entry
en=it.next();//next一次遍历只能取一次,否则就变味了
String key=en.getKey(); //获得key
String value=en.getValue(); //获得value
System.out.println(key+" : "+value);
}
}
}
显示结果:
从结果可以看到HashMap是按照key的值自然排序显示的
对于示例1的简单说明:
示例1对HashMap进行了增删改查的基本操作, 这里的查看HashMap里面的元素方法是比较麻烦的,但是也是要熟练掌握的。
示例二
本示例使用自定义类的数据类型作为value值,同样是增删改查的操作实现。
1.先建一个自定义数据类User
package com.xykj.map2;
public class User {
//为一个用户定义三个基本属性
String name="";
String sex="";
int age=0;
//利用构造方法传递参数
public User(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
//各个参数的get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.再建主方法调用类
package com.xykj.map2;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
public class MainClass {
/**
* HashMap的增删改查操作
* 使用迭代器使用时要用Entry接口
* */
public static void main(String[] args) {
//实例化一个HashMap对象
HashMap< Integer,User>hashMap=new HashMap<>();
//创建一个User对象
User user=new User("name1", "男", 19);
//增加,这里乱序添加,看结果是不是乱序的!
hashMap.put(1,user);
hashMap.put(4,new User("name4", "女", 18));
hashMap.put(2,new User("name2", "女", 22));
hashMap.put(7,new User("name7", "女", 20));
//删除key为“1”的元素。删除时,key和value都要匹配上否则是不会删除成功的
//两个参数的情况
//这里的user如果换成User("name1", "男", 19);不能删除成功,这也可能比较的是地址!!
//hashMap.remove(1,user);
//但是删除使用的是一个参数的方法,可以只输入key的值,注意这里不是游标的值
hashMap.remove(1);
//修改 2的value换成new User("meizi", "女", 19)
hashMap.put(2, new User("meizi", "女", 19));
//用迭代器查看,其他方法好像都是不行的,因为这个相当于层层封装的东西了
Iterator
> it=hashMap.entrySet().iterator();
while (it.hasNext()) {
//这里Entry是个接口
Entry
en=it.next();//next一次遍历只能取一次,否则就变味了
int key=en.getKey(); //获得key
User value=en.getValue(); //获得value,但是User类型的对象
//String name=value.getName(); //获得name,同样可以获得sex和age
System.out.println(key+" : "+value.toString());
}
}
}
运行结果:
从结果可以看到:key值的自然排序。
示例2的简单说明:
本示例主要是value值是自定义类的使用,这个在以后数据存储也是会用到的。
值得注意的是HashMap主要功能是数据的存储和查找,删除数据是麻烦的一件事,而且HashMap基本不用删除数据,多放几个没啥影响的。
实际应用的话一般都是通过key的值来找某一个value的值。
从上面两个例子,可以看到HashMap在实际的应用的具体代码,要学会使用这两种存储方式。