HashMap使用和源码分析

Map键值对

  1. Map和Collection是两个体系

  2. jdk1.2版本后上线,线程不安全.

  3. 键不能重复,值可以重复


  4. 键相同时,值会被后来的覆盖

  5. 可以用null作键或值


Map.Entry:Map专属映射对遍历

  • 返回一个内部接口
  • 效率会高,不用像Set一样再去内存中找value了
package com.li.changGe.maps;

import com.li.changGe.pojo.Student;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapDemo01 {
  public static void main(String[] args) {
    //接口通过子类实现
    Map<Student,String> map = new HashMap();

    Student student = new Student("长歌",18,'女');
    Student student1 = new Student("世民",22,'男');
    Student student2 = new Student("则天",20,'女');
//------------------------------------------------------------------
    /**
     * 键相同时,值会被后来的覆盖
     * 可以用null作键或值
     */
    map.put(student,"燕京");
    map.put(student1,"长安");
    map.put(student2,"静安");
    map.put(new Student("长歌",18,'女'),"北凉");
    map.put(null,null);

    /**
     * {null=null, Student{name='长歌', age=18, sex=女}
     * =北凉, Student{name='世民', age=22, sex=男}
     * =长安, Student{name='则天', age=20, sex=女}
     * =静安}
     */
    System.out.println(map);
  //---------------------------------------------

    //基本遍历
    Set<Student> students = map.keySet();

    Iterator<Student> iterator = students.iterator();
    while (iterator.hasNext()){
      Student next = iterator.next();
      /**
       * null-null
       * Student{name='长歌', age=18, sex=女}
       * -北凉
       * Student{name='世民', age=22, sex=男}
       * -长安
       * Student{name='则天', age=20, sex=女}
       * -静安
       */
      System.out.println(next+"-"+map.get(next));
    }

  //--------------------------------------------

    System.out.println("映射对遍历");
    /**
     * 映射对遍历
     * 返回一个内部接口
     *
     * 效率会高,不用像Set一样再去内存中找value了
     */
    Set<Map.Entry<Student, String>> entries = map.entrySet();
//------------------------------------------------------------
    /**
     * null-null
     * Student{name='长歌', age=18, sex=女}
     * -北凉
     * Student{name='世民', age=22, sex=男}
     * -长安
     * Student{name='则天', age=20, sex=女}
     * -静安
     */
    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());
    }

  }

}

HashMap


源码分析

  1. 初始容量16,加载因子0,75

    defaultCapacity

  2. 链表长度>8,数组length>64:变成红黑树(查找速度特别快)

    linked

  3. 链表长度<6时重新变回链表

  4. 底层是个单向链表:Node对象中只有next.

    next

  5. put()调用putVal(),初始table和size都是0.

    table

    put
    putVal

  6. 将默认大小给newCap,创建新数组,赋值给table
    newCap

  7. 用hash()找个位置添加元素.

    hash

    hash1

  8. size到达阈值后,扩容:oldCap << 1 (2倍)

    olsCap

  9. 1.8前链表是头插入,以后是尾插入.Node对象中只有next

    next

  10. HashSet底层调用的就是HashMap

    HashSet

    add


扩展Hashtable

  • 有个HashTable,1.0版本就有的,运行效率慢,不允许nullKey和nullValue
    Hashtable

  • 但是他的子类Properties属性集合,以后会经常用到
    Properties

先知道一下就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloses

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值