关于Map的说明
Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。
关于Map.Entry<K, V>的说明
Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式。
注意:Map.Entry<K,V>并没有提供设置Key的方法
Map 的常用方法说明
注意:
1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
2. Map中存放键值对的Key是唯一的,value是可以重复的
3. 在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空
4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。
7. TreeMap和HashMap的区别
TreeMap:
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**
* @author 枳洛淮南
* @version 1.0
* @Description map 的使用
* @Date 2021/4/2 下午 15:57
*/
public class mapDemo
{
public static void main(String[] args)
{
Map<String, Integer> mailList = new TreeMap<>();
mailList.put("火警", 119);
mailList.put("警察", 110);
mailList.put("天气", 114);
mailList.put("查号", 114);
//返回所有 key,set 会自动去重
Set<String> keys = mailList.keySet();
System.out.println(keys + "\n");
//返回所有 value
Collection<Integer> values = mailList.values();
System.out.println(values + "\n");
//返回键值对
Set<Map.Entry<String, Integer>> entries = mailList.entrySet();
System.out.println(entries + "\n");
//是否含有该 key
boolean flag = mailList.containsKey("火警");
System.out.println(flag);
flag = mailList.containsKey("匪警");
System.out.println(flag + "\n");
//是否含有该 value
flag = mailList.containsValue(114);
System.out.println(flag);
flag = mailList.containsValue(222);
System.out.println(flag);
}
public static void main1(String[] args)
{
Map<String, Integer> mailList = new TreeMap<>();
mailList.put("ss", 888);
//put 方法返回插入之前该 key 映射的值
Integer v = mailList.put("sh", 123);
System.out.println(v);
System.out.println(mailList);
v = mailList.put("sh", 456);
System.out.println(v);
System.out.println(mailList);
System.out.println();
//get 获取某 key 对应的值,如果没有该 key ,返回null
v = mailList.get("sh");
System.out.println(v);
v = mailList.get("sh");
System.out.println(v);
v = mailList.get("jj");
System.out.println(v);
System.out.println();
//getOrDefault(key value) 获取某 key 对应的值,如果没有该 key ,返回默认的 value
//不会修改集合本身
System.out.println(mailList);
v = mailList.getOrDefault("jj", -1);
System.out.println(v);
System.out.println(mailList);
System.out.println();
//remove(key) 删除key - value 映射关系,返回value,没有 key 则返回 null
v = mailList.remove("sh");
System.out.println(v);
System.out.println(mailList);
System.out.println();
}
}
自己实现的TreeMap:
/**
* @author 枳洛淮南
* @version 1.0
* @Description 功能
* @Date 2021/4/2 下午 16:14
*/
public class MyTreeMap
{
private TreeNode root;
@Override
public String toString()
{
return "MyTreeMap{" +
"root=" + root +
'}';
}
public Integer put(String key, Integer value)
{
if (root == null)
{
root = new TreeNode(key, value);
return null;
}
TreeNode cur = root;
TreeNode parent = null;
while (cur != null)
{
int cmp = key.compareTo(cur.key);
if (0 == cmp)
{
Integer oldValue = cur.value;
cur.value = value;
return oldValue;
} else if (cmp < 0)
{
parent = cur;
cur = cur.left;
} else
{
parent = cur;
cur = cur.right;
}
}
TreeNode node = new TreeNode(key, value);
int cmp = key.compareTo(parent.key);
if (cmp < 0)
{
parent.left = node;
} else
{
parent.right = node;
}
return null;
}
public Integer get(String key)
{
TreeNode cur = root;
while (cur != null)
{
int cmp = key.compareTo(cur.key);
if (0 == cmp)
{
return cur.value;
} else if (cmp < 0)
{
cur = cur.left;
} else
{
cur = cur.right;
}
}
return null;
}
public Integer getOrDefault(String key, Integer defaultValue)
{
Integer v = get(key);
if (v != null)
{
return v;
}
return defaultValue;
}
}