Map 是一种把键对象和值对象进行关联的容器, 而一个值对象又可以是一个Map, 依次类推,这样就可形成一个多级映射。
想想学习英语使用的词典软件,输入英文(key)后,软件会显示出对应的中文(value)。Map就是在内存中的这种结构。
Key(键):
- 和 set— 样,键对象不允许重复,这是为了保持查找结果的一致性。 如果有两个键对象一样, 那你想得到那个键对象所对应的值对象时就有问题了。
- 在使用过程中某个键所对应的值对象可能会发生变化, 这时会按照最后一次修改的值对象与键对应(就是key同一个key有多次值绑定,最后一个就会覆盖之前的)
- 可以使用 null 作为 Key
Value(值):
- 值对象没有唯一性的要求, 你可以将任意多个键都映射到一个值对象上, 这不会发生任何问题( 不过对使用却可能会造成不便, 你不知道你得到的到底是那一个键所对应的值对象,所以请不要这样做)
- 可以使用 null 作为 Value
Map 有两种比较常用的实现: HashMap 和 TreeMap
常用的方法
方法名 | 说明 |
---|---|
put(key , value) | 储存数据 |
get(key) | 通过key得到值 |
remove(key) | 通过key删除对应的值(key当然也会删除) |
entrySet() | 获取Map所有的Key,返回一个Set集合 |
values() | 获取Map所有的value,返回一个List 集合 |
containsKey(key) | 判断Map中是否有输入的参数:key |
containsValue(value) | 判断Map中是否有输入的参数:value |
size() | 判断Map中数据的总数 |
clear() | 清空Map中所有的数据 |
isEmpty() | 判断Map中是否有数据 |
HashMap
HashMap 用到了哈希码的算法, 以便快速查找一个键。
public static void main(String[] args) {
HashMap<String, String> zsInfo = new HashMap<>();
zsInfo.put("name", "张三");
zsInfo.put("height", "173CM");
zsInfo.put("sex", "男性");
for (Map.Entry<String, String> info : zsInfo.entrySet()) {
System.out.println( info );
}
}
负载因子,当容量使用到75%时,触发扩容的操作
DEFAULT_LOAD_FACTOR = 0.75 负载因子 = 0.75
DEFAULT_INITIAL_CAPACITY = 16 默认的初始化容量=16,必须是2的整数次幂,原因是便于Hash运算,提高效率
TREEIFY_THRESHOLD = 8 树化_阈值 = 8 当长度大于8时,链表的查询会变慢,优化为树
TreeMap
TreeMap 是对键按序存放, 因此它便有一些扩展的方法, 比如 firstKey() 、lastKey() 等, 可以从TreeMap 中指定一个范围以取得其子Map
public static void main(String[] args) {
TreeMap<String, String> tree = new TreeMap<>();
tree.put("name", "Jack");
tree.put("age", "22");
tree.put("身高", "173");
tree.put("sex", "man");
tree.put("体重", "70KG");
System.out.println("-------------------");
for (Map.Entry<String, String> entry : tree.entrySet()) {
System.out.println( entry );
}
System.out.println("-------------------");
System.out.println("firstKey = "+ tree.firstKey());
System.out.println("firstEntry = "+ tree.firstEntry());
System.out.println("lastKey = "+ tree.lastKey());
System.out.println("lastEntry = "+ tree.lastEntry());
}
树:红黑树
性质1. 结点是红色或黑色。
性质2. 根结点是黑色。
性质3. 所有叶子都是黑色。(叶子是NIL结点)
性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
性质5. 从任一节结点其每个叶子的所有路径都包含相同数目的黑色结点。