Map键值对
-
Map和Collection是两个体系
-
jdk1.2版本后上线,线程不安全.
-
键不能重复,值可以重复
-
键相同时,值会被后来的覆盖
-
可以用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());
}
}
}
源码分析
-
初始容量16,加载因子0,75
-
链表长度>8,数组length>64:变成红黑树(查找速度特别快)
-
链表长度<6时重新变回链表
-
底层是个单向链表:Node对象中只有next.
-
put()调用putVal(),初始table和size都是0.
-
将默认大小给newCap,创建新数组,赋值给table
-
用hash()找个位置添加元素.
-
size到达阈值后,扩容:oldCap << 1 (2倍)
-
1.8前链表是头插入,以后是尾插入.Node对象中只有next
-
HashSet底层调用的就是HashMap
扩展Hashtable
-
有个HashTable,1.0版本就有的,运行效率慢,不允许nullKey和nullValue
-
但是他的子类Properties属性集合,以后会经常用到
先知道一下就行