package cn.learn.Map;
/*
java.util.Hashtable<k,y> implements Map<k,v>
早期双列集合,jdk1.0开始
同步的,单线程,安全,慢,底层也是哈希表
与HashMap不一样的是,Hashtable key,value不允许存储null
Hashtable与vector一样被多线程集合HashMap和ArrayList取代
但是Hashtable的子类Properties依然活跃,它是唯一一个与I/O流相结合的集合
*/
public class HashtableClass {
}
1 package cn.learn.Map;
2
3 import java.util.HashMap;
4 import java.util.LinkedHashMap;
5
6 /*
7 java.util.LinkedHashMap<k,v> extends HashMap
8 底层原理:
9 哈希表+链表(记录元素的顺序)
10 */
11 public class LinkedHashMapClass {
12 public static void main(String[] args) {
13 HashMap<String,String> map= new HashMap<>();
14 map.put("a","b");
15 map.put("3a","b");
16 map.put("2a","b");
17 map.put("1a","b");
18 System.out.println(map); //key不重复且无序
19
20 LinkedHashMap<String,String> linked = new LinkedHashMap<>();
21 linked.put("a","b");
22 linked.put("3a","b");
23 linked.put("2a","b");
24 linked.put("1a","b");
25 System.out.println(linked); //有序且不重复,存取一致
26 }
27
28 }
1 package cn.learn.Map;
2
3 import java.security.Key;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.Map;
7 import java.util.Set;
8
9 /*
10 java.util.Map1<k,v> -双列集合
11 一个元素包含两个值(一个key,一个value),key不能重合
12 Map中key和value的数据类型可以相同,也可以不同
13
14 java.util.HashMap<k,v>集合 implements Mqp<k,v>接口
15 HashMap集合的特点
16 1.HashMap集合底层是哈希表:查询的速度特别的快
17 2.存储的元素和取出元素的顺序可能不一致
18 3.底层是:数组+单向链表/红黑树 = 哈希表
19
20 java.util.LinkedHashMap<k,v> extends HashMap<k,v>
21 LinkedHashMap的特点:
22 1.存取元素的顺序一致
23 2.哈希表+链表(保证迭代顺序)
24
25 HashMap存储自定义类型键值
26 Map为了保证唯一性,需要重写hashCode和equals方法,以保证key唯一
27 和HashSet一样,value可不唯一
28
29
30 */
31 public class MapMethods {
32 public static void main(String[] args) {
33 show1();
34 }
35 private static void show1(){
36 HashMap<String,String> hashMap = new HashMap<>();
37 //put添加集合元素,若key不在,返回value为空,若存在替换value,返回被替换的value
38 System.out.println(hashMap.put("1","da")); //返回null
39
40 System.out.println(hashMap.put("1","da2")); //返回被替换的值da
41
42 System.out.println(hashMap); //打印了不是地址,说明重写了toString方法{1=da2}
43
44 //remove(Object key)删除元素,存在返回删除的value,不存在返回null
45 String remove = hashMap.remove("1");
46 System.out.println(remove); //da2
47
48 //get(Object key)获取value
49 //containsKey(Object key)判断是否包含指定的键
50 // 包含返回true不包含返回false,和遍历一起使用进行筛选
51
52 //遍历双列集合
53 System.out.println(hashMap.put("2","da29"));
54 System.out.println(hashMap.put("5","da42"));
55 System.out.println(hashMap.put("26","5da2"));
56
57 //KeySet()实际是把Key值取出放入Set<key>集合(不允许重复),则可用迭代器,增强for
58 Iterator<String> iter=hashMap.keySet().iterator(); //此时Set放入的是key值,迭代的也是key值
59 while(iter.hasNext()){
60 String k= iter.next();
61 System.out.println(hashMap.get(k));
62 }
63 //增强for遍历
64 for (String str : hashMap.keySet()) {
65 System.out.println(hashMap.get(str));
66 }
67
68 /*
69 entrySet遍历
70 在Map集合中有个内部接口Entry,Map.Entry<k,v>
71 作用:当Map集合一创建,就会有个Entry对象(键与值的映射关系),放入Set中
72 返回类型 Set<Map.Entry<K,V>>,再调用Set的iterator方法,使用迭代器,取出Map.Entry<Object,Object>
73 再调用Entry的两个方法遍历
74 Map.Entry有两个方法,getKey和getValue
75 */
76 //放入Set
77 Set<Map.Entry<String,String>> set = hashMap.entrySet();
78 //使用迭代器
79 Iterator<Map.Entry<String,String>> it = set.iterator();
80 //利用迭代器方法遍历
81 while(it.hasNext()){
82 //取得Set的元素
83 Map.Entry<String,String> entry= it.next();
84 //调用 Map.Entry的方法
85 System.out.println(entry.getKey());
86 System.out.println(entry.getValue());
87 }//当然可以也可以使用增强for循环
88
89
90 }
91 }