学习map集合的目的?
当有需求要通过某一个信息来查找对应的信息,如:通过姓名查找性别,身份信息,或通过ID查找用户名,注册信息等,这种情况下,就需要用到Map集合。
Map集合提供了集合之间一种映射关系,让集合和集合之间产生关联。
Map集合的特点:
1、可以存储唯一的列的数据(唯一,不可重复性)——Set
2、可以存储重复的数据(可重复性)—— List
3、值的顺序取决于键的顺序,以键查找值,一一对应。
4、键和值都可以存储“null”元素。
注意:
Map集合中,一个映射不能包含重复的键,每个键最多只能映射到一个值。
常用功能:
1.添加功能
V put(K key, V value)
void putAll(Map<? extends K,? extends V> m)
2.删除功能
V remove(Object key)
void clear()
3.遍历功能
Set keySet()
Collection values()
Set<Map.Entry<K,V>> entrySet()
4.获取功能
V get(Object key)
5.判断功能
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
6.修改功能
V put(K key, V value)
void putAll(Map<? extends K,? extends V> m)
7.长度功能
int size()
HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
HashMap不保证映射的顺序,并且不保证该顺序恒久不变。
特点:
1、键无序,唯一,类似于Set集合;
2、值有序,可重复,类似于List;
3、底层数据结构是哈希表,保证键唯一;
4、允许键为null,值为null。
应用案例:
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("金南俊", 25);
map.put("金硕珍", 27);
map.put("闵玧其", 26);
map.put("郑号锡", 25);
map.put("朴智旻", 24);
map.put("金泰亨", 23);
map.put("田柾国", 22);
System.out.println(map);
//将泰泰年龄增加1岁
map.put("金泰亨", 24);
System.out.println(map);
//防弹全体成员年龄加1岁
for(String key : map.keySet()) {
map.put(key, map.get(key) + 1);
}
System.out.println(map);
//遍历防弹成员姓名
Set keys = map.keySet();
for (String key : keys) {
System.out.print(key + " ");
}
System.out.println();//换行
//遍历防弹成员年龄
Collection values = map.values();
for (Integer value : values) {
System.out.print(value + " ");
}
System.out.println();//换行
//遍历防弹成员姓名和年龄
Set<Entry<String, Integer>> kv = map.entrySet();
for (Entry<String, Integer> entry : kv) {
System.out.print(entry.getKey() + ":" + entry.getValue() + " ");
}
}
LinkedHashMap
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
特点:
1、键有序,且唯一;
2、值有序,可重复,类似于List;
3、底层数据结构是哈希表和链表,哈希表保证键的唯一性,链表保证键的有序性。
public static void main(String[] args) {
LinkedHashMap<Integer, String> lhm = new LinkedHashMap<Integer, String>();
lhm.put(01, "金泰亨1");
lhm.put(02, "金泰亨2");
lhm.put(03, "金泰亨3");
lhm.put(04, "金泰亨4");
lhm.put(05, "金泰亨5");
Set keys = lhm.keySet();
for (Integer key : keys) {
System.out.println(key + "|" + lhm.get(key));
}
}
TreeMap
基于红黑树(Red-Black tree)的 NavigableMap 实现。
该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
特点:
1、键可排序,且唯一;
2、值有序,可重复,类似于List;
3、底层数据结构是自平衡的二叉树,可排序;
4、排序方式类似于TreeSet,分为自然排序和比较器排序,具体取决于使用的构造方法。
public static void main(String[] args) {
TreeMap<Integer, String> tm = new TreeMap<Integer, String>();
tm.put(26, "金南俊");
tm.put(28, "金硕珍");
tm.put(27, "闵玧其");
tm.put(26, "郑号锡");
tm.put(25, "朴智旻");
tm.put(25, "金泰亨");
tm.put(23, "田柾国");
tm.put(23, "田柾国");
tm.put(25, "金泰亨");
Set keys = tm.keySet();
for (Integer key : keys) {
String value = tm.get(key);
System.out.println(key + "|" + value);
}
}
hashtable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。
特点:
1、不允许null键和null值;
2、线程安全,效率低;
HashMap和Hashtable的区别:
1、HashMap是不安全的不同步的效率高的 允许null键和null值
2、Hashtable是安全的同步的效率低的 不允许null键和null值
3、两者底层都是哈希表结构;
public static void main(String[] args) {
Hashtable<String, String> hashtable = new Hashtable<String, String>();
hashtable.put("金南俊", "rap");
hashtable.put("金硕珍", "vocal");
hashtable.put("闵玧其", "rap");
hashtable.put("郑号锡", "rap");
hashtable.put("朴智旻", "vocal");
hashtable.put("金泰亨", "vocal");
hashtable.put("田柾国", "vocal");
System.out.println(hashtable);
Enumeration keys = hashtable.keys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
String value = hashtable.get(key);
System.out.println(key + "|" + value);
}
}
}