目录
一、Map接口特点
1)语法特点
import com.feiyang.static1.main;
import java.util.HashMap;
/**
* @author: 程序员飞扬
* @description:
*/
public class Map_ {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("no1","张三丰");//k-v
hashMap.put("no2","杨逍");//k-v
hashMap.put("no2","韦一笑");//k重复时,v会被替换
System.out.println(hashMap);
hashMap.put("no3","周芷若");
hashMap.put("no4","周芷若");//k不能重复,v可以重复
System.out.println(hashMap);
hashMap.put(null,null);//k-v可以为null
hashMap.put("no5",null);
System.out.println(hashMap);
hashMap.put(1,"赵敏");
hashMap.put(new Object(),"小昭");
System.out.println(hashMap);
}
}
输出:
{no2=韦一笑, no1=张三丰, no4=周芷若, no3=周芷若}
{no2=韦一笑, null=null, no1=张三丰, no4=周芷若, no3=周芷若, no5=null}
{no2=韦一笑, null=null, no1=张三丰, 1=赵敏, no4=周芷若, no3=周芷若, no5=null, java.lang.Object@4554617c=小昭}
2)底层逻辑
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author: 程序员飞扬
* @description:
*/
public class MapSource_ {
public static void main(String[] args) {
Map hashMap = new HashMap();
/**
* put()
*/
hashMap.put("no1","张三丰");//k-v
hashMap.put("no2","杨逍");//k-v
//hashMap.put(new Car_(),new Person_());
System.out.println(hashMap);//{no2=杨逍, no1=张三丰}
/**
* get(key)
*/
System.out.println(hashMap.get("no1"));//张三丰
/**
* 1.k-v 最后是 HashHap$Node node = newNode(hash, key, value, null)
*
* 2.k-v为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素类型Entry,而一个Entry对象就有
* k,v EntrySet<Entry<K,V» 即:transient Set<Map.Entry<K,V» entrySet;
*
* 3. entrySet巾,定义的类型是Map.Entry,但是实际上存放的还足HashMap$Node
* 这时因为 static class Node<K,V> implements Map.Entry<K,V>
*
* 4. 当把HashtMap$Node对象存放到entrySet就方便我们的遍历,因为Map.Entry提供了重要方法
* K getKey(); V getValue();
*
*/
/**
* entrySet()
*/
Set set = hashMap.entrySet();//返回entrySet,方便遍历
for (Object obj : set) {
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey() + "-" + entry.getValue());//no2-杨逍
//no1-张三丰
}
/**
* keySet()
*/
Set set1 = hashMap.keySet();//返回
System.out.println("set1=" + set1.getClass());//set1=class java.util.HashMap$KeySet
for (Object o : set1) {
System.out.print(o + " ");//no2 no1
}
System.out.println();
/**
* values()
*/
Collection values = hashMap.values();
System.out.println("values=" + values.getClass());//values=class java.util.HashMap$Values
System.out.println(values);//[杨逍, 张三丰]
}
}
class Car_{
}
class Person_{
}
二、Map接口方法
1.Map体系图
2.常用方法
3.Map三种遍历方式
import java.util.*;
/**
* @author: 程序员飞扬
* @description:
*/
public class MapFor {
public static void main(String[] args) {
Map map = new HashMap();
map.put("邓超","孙俪");
map.put("王宝强","马蓉");
map.put("宋哲","马蓉");
map.put("肖战",null);
map.put(null,"刘亦菲");
map.put("鹿晗","关晓彤");
//第一种:通过keySet方式
System.out.println("第一种:通过keySet方式");
Set keys = map.keySet();
Iterator iterator = keys.iterator();
while(iterator.hasNext()){
Object key = iterator.next();
Object value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("--------------------------");
for (Object key : keys) {
System.out.println(key + "-" + map.get(key));
}
//第二中:把所有values取出
System.out.println("第二中:把所有values取出");
Collection values = map.values();
Iterator iterator1 = values.iterator();
while(iterator1.hasNext()){
Object value = iterator1.next();
System.out.println(value);
}
System.out.println("--------------------------");
for (Object value : values) {
System.out.println(value);
}
//第三种:通过EntrySet来获取k-v
System.out.println("第三种:通过EntrySet来获取k-v");
Set entrySet = map.entrySet();
Iterator iterator2 = entrySet.iterator();
while(iterator2.hasNext()){
Object obj = iterator2.next();
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey() + ":" + entry.getValue());
}
System.out.println("--------------------------");
for (Object o: entrySet) {
Map.Entry entry = (Map.Entry)o;
System.out.println(entry.getKey() + "-" + entry.getValue());
}
}
}
输出:
第一种:通过keySet方式
邓超:孙俪
null:刘亦菲
王宝强:马蓉
鹿晗:关晓彤
宋哲:马蓉
肖战:null
--------------------------
邓超-孙俪
null-刘亦菲
王宝强-马蓉
鹿晗-关晓彤
宋哲-马蓉
肖战-null
第二中:把所有values取出
孙俪
刘亦菲
马蓉
关晓彤
马蓉
null
--------------------------
孙俪
刘亦菲
马蓉
关晓彤
马蓉
null
第三种:通过EntrySet来获取k-v
邓超:孙俪
null:刘亦菲
王宝强:马蓉
鹿晗:关晓彤
宋哲:马蓉
肖战:null
--------------------------
邓超-孙俪
null-刘亦菲
王宝强-马蓉
鹿晗-关晓彤
宋哲-马蓉
肖战-null
4.HashMap小结
三、HashMap源码解读
1.HashMap底层机制
2.HashMap源码剖析
案例:
import java.util.HashMap;
/**
* @author:程序员飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class HashMapSource1 {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("java",10);
hashMap.put("python",20);
hashMap.put("java",20);
System.out.println(hashMap);
}
}
第一步:创建hashMap对象(第10行代码)
第二步:执行第11行代码
进入put()方法
①hash(key)方法,经过算法得到key的哈希运算后的值 ((key的哈希值)异或运算(哈希值的无符号右移16位))
^/>>>,位运算,详见《Java筑基05-进制&位运算》
②进入putVal方法
③初始化hashMap容积
④创建Node
第三步:执行第12行代码
第四步:执行13行代码
如果数据量小,不需要树化,就到此为止
分析完毕。
四、HashTable
1.hashTable使用
2.hashTable扩容
3.hashMap与hashTable对比
4.Properties类
/**
* @author:程序员飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class Properties_ {
public static void main(String[] args) {
Properties properties = new Properties();
//增
properties.put("ll",11);
properties.put("pp",22);
properties.put("tt",33);
//properties.put(null,33);
//properties.put("ss",null);//键和值都不能为空,否则抛异常NullPointerException
//删
properties.remove("ll");
//改
properties.put("tt",44);
//查
properties.get("pp");
System.out.println(properties);
}
}
输出:
{pp=22, tt=44}
五、TreeMap
import java.util.Comparator;
import java.util.TreeMap;
/**
* @author:程序员飞扬
* @公众hao:程序员飞扬
* @description:
*/
public class TreeMap_ {
public static void main(String[] args) {
//按key字母排序
/*TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String)o1).compareTo(((String)o2));
}
});*/
/*treeMap.put("aaa","aaa");
treeMap.put("bbb","bbb");
treeMap.put("ddd","ddd");
treeMap.put("ccc","ccc");*/
//System.out.println(treeMap);输出:{a=aaa, bb=bbb, ccc=ccc, ddd=ddd}
//按key的长度排序,如果key长度相同,value会被替换
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String)o1).length() - (((String)o2).length());
}
});
/*treeMap.put("aaa","aaa");
treeMap.put("bbb","bbb");
treeMap.put("ddd","ddd");
treeMap.put("ccc","ccc");*/
treeMap.put("a","aaa");
treeMap.put("bb","bbb");
treeMap.put("ccc","ccc");
treeMap.put("ddd","ddd");
System.out.println(treeMap);//{a=aaa, bb=bbb, ccc=ddd}
}
}