HashMap:底层是哈希表数据结构,允许使用null键null值,该集合线程不同步, jdk1.2,效率高。
首先需要导入的包名:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
然后再声明一个HashMap集合:
Map<String, String> map = new HashMap<String, String>();;
// 添加元素,如果添加时出现相同的键,那么会面添加的值会覆盖前面的键对应的值,
//put方法会返回被覆盖的值。
map.put("01", "zhangsan1");
map.put("01", "wangwu");
map.put("02", "zhangsan2");
map.put("03", "zhangsan3");
System.out.println(map);
上面代码有两个’01’的键,所以键值相同,前面的值将会被覆盖,
返回结果: {01=wangwu, 02=zhangsan2, 03=zhangsan3};
System.out.println("containsKey:" + map.containsKey("01"));
// containsKey() 查找键是否存在,返回Boolean类型;
System.out.println("remover:" + map.remove("02"));
// remover() 移除对应的键的数据;不存在返回null;
map.put("04", null);
System.out.println("get:" + map.get("04"));
//get()获取对应的键的数据,不存在返回null;
// 可以通过get方法的返回值来判断一个键是否存在,可通过返回null来判断,但是注意可能只本就是null的情况。
// 获取map集合中所有的值;
Collection<String> coll = map.values();
System.out.println(coll);
//返回结果:[null, wangwu, zhangsan3]
Map的两种取出方式:
// 1、Set<k> KeySet:在通过Set集合中的迭代器取出Set集合中的键。通过map的get(key)方法获取对应的键的值。
// 2、Set<Map.Entry<k,v>> EntrySet:将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry。
重新声明集合,并添加数据:
Map<String, String> maps = new HashMap<String, String>();
maps.put("A", "小A");
maps.put("B", "小B");
maps.put("C", "小C");
maps.put("D", "小D");
// KeySet取出:
Set<String> keyset = maps.keySet();//获取集合中所有的键
Iterator<String> iter = keyset.iterator();//迭代器;
while (iter.hasNext()) {
String key = iter.next();//拿出单个键;
String vaule = maps.get(key);//根据键在获取值;
System.out.print("Key:" + key + ", Values:" + vaule + "\t");
}
System.out.println();
// EntrySet取出,将Map集合中的映射关系取出,存入到Set集合中。
Set<Map.Entry<String, String>> entry = maps.entrySet();
Iterator<Map.Entry<String, String>> iten = entry.iterator();
while (iten.hasNext()) {
Map.Entry<String, String> me = iten.next();
String key = me.getKey();//获取键;
String value = me.getValue();//获取值;
System.out.print("Key:" + key + ", Values:" + value + "\t");
}
这两种方法输出的结果:
Key:D, Values:小D Key:A, Values:小A Key:B, Values:小B Key:C, Values:小C
我们来做一个练习:
要求:每一个学生都有对应的归属地。 学生Student,地址String,学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生,保证学生的唯一性。
第一步:先建立一个学生对象
//注意:凡是带有Hash的集合都要复写hashCode、equals方法;
class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int hashCode() {
return this.name.hashCode() + this.age * 23;
// 获取哈希值,也是判断哈希值是否有相等的数据,有就进行equals方法判断;
}
public boolean equals(Object obj) {
if (!(obj instanceof Student))// 判断obj是否等于Student;
throw new ClassCastException("类型不匹配"); // 抛出异常;
Student stu = (Student) obj;
return this.name.equals(stu.name) && this.age == stu.age;
}
}
第二步:声明一个HashMap集合,并添加数据
Map<Student, String> stu = new HashMap<Student, String>();
stu.put(new Student("小A", 20), "广州");
stu.put(new Student("小B", 21), "上海");
stu.put(new Student("小A", 22), "北京");
stu.put(new Student("小C", 20), "江西");
stu.put(new Student("小A", 20), "西安");
第三步:取出数据:
Iterator<Student> setstu = stu.keySet().iterator();
while (setstu.hasNext()) {
Student sd = setstu.next();
String name = sd.getName();
int age = sd.getAge();
String value = stu.get(sd);
System.out.println("name: " + name + ", age:" + age + ", value:"
+ value);
}
打印结果:
第一条数据:stu.put(new Student("小A", 20), "广州")被覆盖了,我们在Student这个类中做了比较,首先比较哈希值是否相同,若是相同在进行equals比较,还是相同的话就进行剔除。
注意:这里是将student作为键,地址作为值,键要唯一,键相同就覆盖前面的值;