package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
import java.util.Map;
import java.util.TreeMap;
public class HashMapTest {
/*
* HashMap
* 一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射
* 基于hashing的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象
* 当put()方法传递键和值时,会先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket
* 位置来存储Entry对象的,是非线程安全的,所以HashMap操作速度很快
* */
/*
* 在数据的存储过程中,能够自动对数据进行排序,实现了SortedMap接口,它是有序的集合
* TreeMap使用的存储结构是平衡二叉树,也称为红黑树
* 默认排序规则:按照key的字典顺序来排序(升序),也可以自定义排序规则,要实现Comparator接口
* */
/*
* HashMap可实现快速存储和检索,但缺点是包含的元素是无序的,适用于在Map中插入、删除和定位元素;
* TreeMap能便捷地实现对其内部元素的各种排序,但其一般性能比HashMap差,适用于按自然顺序或自定义顺序
* 遍历键(key)
* Jdk1.7和Jdk1.8中HashMap的主要区别 - 底层实现由之前的“数组+链表”改为“数组+链表+红黑树”
* 什么时候开始转变
* 当链表节点较少时仍然是以链表存在,当链表节点较多时,默认是大于8时会转为红黑树
* */
public static void main(String [] args) {
// HashMap<String, String> map = new HashMap<>();
TreeMap<String,String> map = new TreeMap<>();
// 往map里面放key-value
map.put("A小明", "Guangzhou");
map.put("B小黄", "Shanghai");
map.put("C小黄", "Shanghai");
map.put("D小黄", "Shanghai");
System.out.println("=====Map=======");
System.out.println(map);
System.out.println("============");
// 根据key获取value
String value = map.get("小黄");
System.out.println("value is " + value);
// 判断是否包含某个key
boolean isContains = map.containsKey("小明");
System.out.println("包含小明" + isContains);
// 返回map的元素数量
int size = map.size();
System.out.println("size = " + size);
// 获取所有value集合
Collection<String> collect = map.values();
System.out.println(collect);
// 获取所有key的集合
Set<String> set = map.keySet();
System.out.println(set);
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry entry : entrySet) {
System.out.println("key="+entry.getKey()+", value="+entry.getValue());
}
// 判断Map是否为空
boolean isEmpty = map.isEmpty();
System.out.println("是否为空:"+isEmpty);
// 清空容器
map.clear();
isEmpty = map.isEmpty();
System.out.println("是否为空:"+isEmpty);
}
}