Map的常用方法
新建一个雇员类,分配一些属性:id。name,salary等属性。
构造Employee方法,get,set方法
在main方法定义Employee类,给定雇员信息,通过Map方法通过键值对存储,输出
此时输出的雇员信息仍是信息的地址,需要重写toString方法,return信息。
package cn.sxt.collection;
import java.util.HashMap;
import java.util.Map;
/**
*测试Map常用方法
*/
public class TestMap02 {
public static void main(String[] args) {
Employee e1=new Employee(1001,"单清宝",50000);
Employee e2=new Employee(1002,"小宝",5000);
Employee e3=new Employee(1003,"阿宝",60000);
Employee e4=new Employee(1001,"大宝",6000);
Map<Integer, Employee> map= new HashMap<>();
map.put(1001,e1);
map.put(1002,e2);
map.put(1003,e3);
map.put(1001,e4);
Employee emp=map.get(1002);
System.out.println(emp.getName());
System.out.println(map.get(1003));
}
}
//雇员信息
class Employee{
private int id;
private String name;
private double salary;
public Employee(int id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "\n"+"id:"+id+"\n"+"name:"+name+"\n"+"薪水:"+salary+"\n";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
HashMap
HashMap的底层实现采用哈希表,这是一种非常重要的数据结构。
哈希表的基本结构就是“数组+链表”。
核心数据结构:1.6叫Entry[]table数组,1.8以后叫Node[]table数组,其实都表达的时节点对象的数组
目的是将键值对两个对象以|hash|key|value|next|形式存放入HashMap的Entry(Node)[]数组中
存储的方式有很多
先获得key对象的hashcode:key对象先调用hashcode()方法获得hashcode
根据hashcode计算出hash值(要求在[0,数组长度-1]区间)
计算的方法有很多,尽量分散开些,便于查找,效率高,算法自然也好。
极端简单和低下的算法
hash值=hashcode/hashcode;
的出的值都为1,所以所有的链表都存在了数组Entry[0]里了,其它都空着,查询麻烦速度很慢,所以很低下,但算法简单,HashMap也就退化成了“链表”。
一种简单和常用的算法是:相处取余算法
hash值=hashcode/数组长度
这种算法让hash值分布均匀,空间利用高,但使用了“除法”,效率低下
然后进行了改进**hash值=hashcode&(数组长度-1)**但数组长度必须是2的整数幂如:2,4,8,16,32,64等。
取数据过程get(key)
同样是通过Key调取hashcode[]方法,得出哈希码,通过hash散列算法得到hash值,通过得到的余数可以找到存储的数组位置,通过equals()方法挨个比较key,返回值为ture,返回相对应的value值
java中规定,两个内容相同(equals()为ture)的对象必须具有相等的hashcode。
HashMap的位桶数组初始是16,可变得,可以扩容