47 容器(六)——HashMap
HashMap的概念
HashMap底层实现了哈希表,这是一种非常重要的数据结构,对于以后我们理解很多技术都有帮助,例如 redis数据库的核心技术和HashMap一样,因此,非常有必要让大家理解。
HashMap的数据结构由数组和链表来实现对数据的存储,它们各有特点:
- 数组:占用空间连续,寻址容易,查询速度快。但是增删效率低。
- 链表:占用空间不连续,寻址困难,查询速度慢。但是增删效率高。
将数据与链表的优点结合起来,就得到了我们的哈希表。因此哈希表的本质就是数组+链表。
HashMap的常用方法
关键点摘要:
- 泛型可以使用基本数据类型,也可以使用引用数据类型
- 使用put填入同一个key,后面的key对应的值会替换前面的key对应的值
- 替换replace与remove方法都有两种形式,返回被删除/替换的值和返回boolean。
package _20191211; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * HashMap部分方法测试 * @author TEDU * */ public class HashMapTest { public static void main(String[] args) { Map<Integer,String> myMap = new HashMap<>(); myMap.put(1,"one"); myMap.put(2,"two"); myMap.put(3,"three"); System.out.println(myMap.get(1));//返回key对应的值 System.out.println(myMap.containsKey(3));//是否包含指定的key System.out.println(myMap.containsValue("One"));//是否包含指定的值 //移除方法 System.out.println(myMap.remove(2));//移除指定的key,返回其值 System.out.println(myMap); System.out.println(myMap.remove(1,"one"));//移除指定的key与value,返回boolean System.out.println(myMap); //key不能重复,若重复,会将该key对应的value覆盖,不可以将此方法做替换方法用,不便于阅读 myMap.put(3,"三"); System.out.println(myMap); //替换方法 replace 只能替换已存在的键值对 System.out.println(myMap.replace(3,"three"));//返回被替换的值 System.out.println(myMap.replace(1,"one"));//只能替换已存在的 System.out.println(myMap.replace(3, "three", "叁"));//返回布尔值 System.out.println(myMap); //putAll 将一个map添加到另一个map Map<Integer,String> myMap2 = new HashMap<>(); myMap2.put(4, "肆"); myMap.putAll(myMap2); System.out.println(myMap); //返回key的set集合 Set<Integer> keySet = myMap.keySet(); System.out.println(keySet); //返回value的集合 Collection values = myMap.values(); System.out.println(values); } }
一个例子:
使用HashMap存储一个公司的员工信息。(泛型可以使用基本数据类型,也可以使用引用数据类型)
package _20191211; import java.util.HashMap; import java.util.Map; public class HashMapTest02 { public static void main(String[] args) { Employee ep1 = new Employee("小白",20000); Employee ep2 = new Employee("小黑",10000); Map<Integer,Employee> mp = new HashMap<>(); mp.put(1001,ep1); mp.put(1002,ep2); System.out.println(mp); } } class Employee{ private String name; private int salary; public Employee(String name, int salary) { super(); this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } @Override public String toString() { return " 姓名:"+name+" 薪水:"+salary; } }
HashMap与HashTable的区别
HashMap:线程不安全,效率高,允许key与value为null
HashTable:线程安全,效率低,不允许key与value为null