集合之Map接口

------------恢复内容开始------------

与Collection接口互为两个体系,Map接口存储的是双列数据,key-value数据对,

实现类包括:HashMap,linkedHashMap,TreeMap,HashTable,properties

主要实现类是HashMap:

常用方法:

增:put()

删:remove()

改:put(),put是修改覆盖前一个数据

查:get()

长度:size()

遍历:

keyset方法遍历key

values方法遍历value

entrySet方法遍历key-value:首先调用此方法,得到一个Set类型的变量,使用迭代器it,next再强转为entry类型,调用getkey与getvalue方法遍历

 1 /**一:说明:
 2  * Map接口:存储的双列数据,存储的key-value对的数据--类似于函数y=f(x)
 3  * 实现类:HashMap,LinkedHashMap    TreeMap    HashTable,Properties
 4  * 1:HashMap:作为主要实现类,线程不安全,效率高,可以存储null的key-value
 5  * 底层是数组+链表+红黑树
 6  * 2:LinkedHashMap:是HashMap的子类,加入了链表结构,保证再遍历map元素时,可以按照添加的顺序实现遍历
 7  * 对于频繁的遍历操作,才会考虑使用此类
 8  * 3:TreeMap:保证按照添加的key-value对进行排序进行遍历,使用key的自然排序或定制排序
 9  * 底层是红黑树
10  * 4:HashTable:古老的实现类,out了
11  * 5:properties:HashTable的子类,常用来处理配置文件,key-value都是String类型
12  * *******************************
13  * 二:源码分析
14  * 1:HashMap的底层实现原理:
15  * JDK7中:
16  *HashMap map=new HashMap()
17  * 实例化之后,底层创建了一个长度16的数组Entry[]table,
18  * map.put(key1,value1):首先计算key1的哈希值(通过调用key1所在类的hashcode方法),此哈希值经过某种算法计算
19  * 得到在Entry数组中的位置
20  * 如果此位置上面没有数据,添加成功,
21  * 如果此位置上有数据:比较与已经存在数据的哈希值,如果key1的哈希值不同于他们,则添加成功,
22  * 如果key1的哈希值与某一个相同(key2,value2),则继续比较,调用key1所在类的equals方法,
23  * 如果返回false则添加成功,返回true,使用value1替换value2,
24  * JDK8中:
25  * 底层建立的数组叫Node[],而非Entry[],首次调用put方法时才会创建长度16的数组
26  * 对于JDK7相比.8中数据存储的结构新增了红黑树,什么时候使用红黑树呢?
27  * 在单个数据的链表超过8个,且数组长度超过64时,此时此链表上的数据改为红黑树存储
28  * *****************
29  *          important:key是用set(无序不可重复)进行存储,value是用collection(无序可重复)进行存储
30  * 三:Map中常用方法
31  * 增:put,putAll
32  * 删:remove,clear(清楚所有数据)
33  * 改:replace
34  * 查:get
35  * 长度:size
36  * 遍历:key遍历,首先使用keySet方法得到一个set类型变量,然后遍历此变量
37  *      value遍历,首先使用values方法得到一个collection类型变量,然后遍历此变量
38  *      key-value遍历:使用entrySet方法得到一个Set类型对象,
39  *      然后正常迭代器迭代,此时将Set对象转换成Entry类型,调用get方法得到key与value,
40  *
41  */
42 public class HashMapTest {
43     @Test
44     public void test(){
45         Map map=new HashMap();
46         Map map1=new HashMap();
47         map.put(null,123);
48         map.put(1,"hpp");
49         map.put("换","hpp");
50         map1.put(1,154);
51         map1.put("bb",4);
52         map.put(1, LocalDateTime.now());
53         map.putAll(map1);
54         map.remove("换");
55         System.out.println(map.get(1));
56         map.replace(1,132612);
57         //map.clear();//清空数据
58         System.out.println(map.size());//key相同,value会被替换,value可以重复,key不可以
59         /**
60          * 遍历key
61          */
62         map.keySet();//得到一个set类型的key的组合值
63         Set set=map.keySet();//此时遍历set即可
64         for (Object obj:set){
65            System. out.println(obj);
66         }
67 
68         /**
69          * 遍历value
70          */
71         Collection collection=map.values();//得到collection类型的value值
72         System.out.println(collection);
73         Iterator iterator=collection.iterator();
74         while (iterator.hasNext()){
75             System.out.println(iterator.next());
76         }
77         /**
78          * 遍历key-value,首先调用entrySet方法得到一个Set类型对象,
79          * 然后正常迭代器迭代,此时将Set对象转换成Entry类型,调用get方法得到key与value,
80          */
81         Set set1=map.entrySet();
82         System.out.println(set1);
83         Iterator iterator1 =set1.iterator();
84         while (iterator1.hasNext()){
85            // System.out.println(iterator1.next());
86            Map.Entry entry1=(Map.Entry) iterator1.next();//进行强转
87             System.out.println(entry1.getKey()+":"+entry1.getValue());
88         }
89         System.out.println(map);
90     }
91 }

------------恢复内容结束------------

上一篇:mybatis动态sql的标签


下一篇:Java学习笔记之泛型(五):泛型的上下限