hashMap


hashMap的使用

存储结构:哈希表(数组+链表+红黑树)
重复依据
键的hashcode和equals方法

源码分析

1 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4(16) ; //hashMap初始容量大小
2 static final int MAXIMUM_CAPACITY = 1 << 30 ; // hashmap的数组最大容量
3 static final float DEFAULT_LOAD_FACTOR = 0.75f;//默认加载因子
4 static final int TREEIFY_THRESHOLD = 8; //jdk1 .8 当链表长度大于8时,调整成红黑树
5 static final int UNTREEIFY_THRESHOLD = 6; //jdk1.8当链表长度小于6时,调整成链表
6 static final int MIN_TREETFY_CAPACITY = 64;//jdk1.8当链表长度大于8时,并且集合元素个数大于等于64时,调整成红黑树
7 transient Node[] table ;//哈希表中的数组
8 size;//元素个数
(1 )HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16
(2)当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。
(3) jdk1.8 当每个链表长度大于8,并且数组元素个数大于等于64时,会调整为红黑树,目的提高执行效率
(4) jdk1.8当链表长度小于6时,调整成链表
(5)jdk1.8以前,链表时头插入, jdk1.8以后时是尾插入

package Collection.Map.Demo02;

import java.util.HashMap;
import java.util.Map;

/**
 * hashMap的使用
 * 存储结构:哈希表(数组+链表+红黑树)
 *
 * @author liu
 */
public class Demo01 {
    public static void main(String[] args) {
        //创建集合
        HashMap students = new HashMap<>();
        //1添加元素
        Student s1 = new Student("孙悟空", 01);
        Student s2 = new Student("猪八戒", 02);
        Student s3 = new Student("沙和尚", 03);

        students.put(s1, "北京");
        students.put(s2, "上海");
        students.put(s3, "北京");
        //new是hashcode不一致,会添加新的元素,所以可以改equal方法
        students.put(new Student("沙和尚", 03), "北京");
        System.out.println(students.toString());
        System.out.println(students.size());

        //2删除
/*      students.remove(s1);
        System.out.println(students.size());*/
        //3遍历
        System.out.println("---------------keySet()--------------");
        for (Student key : students.keySet()) {
            System.out.println(key+students.get(key));
        }
        System.out.println("---------------entrySet()--------------");
        for (Map.Entry entry : students.entrySet()) {
            System.out.println(entry.getKey()+entry.getValue());
        }

        //4判断
        System.out.println(students.containsKey(s1));
        System.out.println(students.containsKey(new Student("沙和尚", 03)));
        System.out.println(students.containsValue("上海"));
    }
}

学生表

package Collection.Map.Demo02;


import java.util.Objects;

public class Student {
    private String name;
    private int stuNo;

    public Student() {
    }

    public Student(String name, int stuNo) {
        this.name = name;
        this.stuNo = stuNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getStuNo() {
        return stuNo;
    }

    public void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", stuNo=" + stuNo +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return getStuNo() == student.getStuNo() && Objects.equals(getName(), student.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getStuNo());
    }
}