HashMap的使用
HashMap和HashSet类似,不过HashMap存储的的键值对,他们的存储结构都是哈希值(数组+链表+红黑树),所以他们在确认元素是否重复时都必须重写equals与hashcode方法。
JDK1.2版本开始出现,线程不安全,只用于单线程,运行效率快;允许使用null作为key或是value
Student类(重写equals与hashcode方法)
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
代码实现HashMap的使用
/**
* HashMap集合的使用
* 存储结构:哈希表(数组+链表+红黑树)
*/
public class Test {
public static void main(String[] args) {
//创建集合
HashMap<Student,String> hashMap = new HashMap<>();
//1添加元素
Student s1 = new Student("学生一", 22);
Student s2 = new Student("学生二", 27);
Student s3 = new Student("学生三", 221);
Student s4 = new Student("学生四", 23);
hashMap.put(s1,"北京");
hashMap.put(s2,"上海");
hashMap.put(s3,"浙江");
hashMap.put(s4,"深圳");
System.out.println(hashMap.toString());
//2删除元素
//hashMap.remove(s1);
//hashMap.remove(new Student("学生二", 27));
//直接删除new的对象的话需要在元素的对象类型里重写equals()与hashcode()方法
//System.out.println(hashMap.size());//2
//3遍历
//3.1增强for循环
//使用HashMap的keySet()方法返会键的Set集合
Set<Student> students = hashMap.keySet();
System.out.println("======================keySet()============================");
System.out.println("=============增强for循环=============");
for(Student student:students){
System.out.println(student+"-----"+hashMap.get(student));
}
System.out.println("=================迭代器==================");
Iterator<Student> iterator = students.iterator();
while (iterator.hasNext()){
Student next = iterator.next();
System.out.println(next+"---------"+hashMap.get(next));
}
//使用HashMap的entrySet()方法返回键值Set集合
Set<Map.Entry<Student, String>> entries = hashMap.entrySet();
System.out.println("======================entrySet()============================");
System.out.println("=============增强for循环=============");
for (Map.Entry<Student, String> entry:entries){
System.out.println(entry.getKey()+"---------"+entry.getValue());
}
System.out.println("=================迭代器==================");
Iterator<Map.Entry<Student, String>> iterator1 = entries.iterator();
while (iterator1.hasNext()){
Map.Entry<Student, String> next = iterator1.next();
System.out.println(next.getKey()+"----------"+next.getValue());
}
//4判断
System.out.println(hashMap.containsKey(new Student("学生一", 22)));//true
System.out.println(hashMap.containsValue("龙南"));//false
System.out.println(hashMap.isEmpty());//false
}
}