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
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());
}
}