Day19

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,可变得,可以扩容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值