------------恢复内容开始------------
与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 }
------------恢复内容结束------------