Java基础(七)双列集合—Map.docx

上传人:A*** 文档编号:142725219 上传时间:2020-08-22 格式:DOCX 页数:9 大小:55.70KB
返回 下载 相关 举报
Java基础(七)双列集合—Map.docx_第1页
第1页 / 共9页
Java基础(七)双列集合—Map.docx_第2页
第2页 / 共9页
Java基础(七)双列集合—Map.docx_第3页
第3页 / 共9页
Java基础(七)双列集合—Map.docx_第4页
第4页 / 共9页
Java基础(七)双列集合—Map.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Java基础(七)双列集合—Map.docx》由会员分享,可在线阅读,更多相关《Java基础(七)双列集合—Map.docx(9页珍藏版)》请在金锄头文库上搜索。

1、Java基础(七)双列集合Map文章目录双列集合Map问题1.概述 方法 遍历方式HashMap 1.源码分析: 2.hash方法的原理: 3.put方法的原理: 4.如何将链表结构转换成树结构?HashtableTreeMapProperties类IO流双列集合Map问题1.Map 中的 Entry 接口是什么作用?interface Entry 1)HashMap/HashTable中:元素Node实现Map.Entry接口)static class Node implements Map.Entry final int hash; final K key; V value; Node n

2、ext; 2)TreeMap中:元素Entry实现Map.Entry接口static final class Entry implements Map.Entry K key; V value; Entry left; Entry right; Entry parent; boolean color = BLACK; 3)LinkedHashMap中:元素 Entry 实现 继承自 HashMap.Nodestatic class Entry extends HashMap.Node Entry before, after; Entry(int hash, K key, V value, No

3、de next) super(hash, key, value, next); 2.Map接口中的 entrySet() 方法:?SetMap.Entry entrySet();3.关于 null 值的存储:1)ArrayList 能存储 null源码: public boolean add(E e) ensureCapacityInternal(size + 1); / Increments modCount! elementDatasize+ = e; return true; 此外输出该list对象时:System.out.println(list);/println() 会将 list

4、 转为 String : String.valueOf(x)String s = String.valueOf(x);/String.valueOf(x):return (obj = null) ? null : obj.toString();2)HashMap 能存储 null key 和 null value (对应HashSet LinkedHashSet LinkedHashMap) 因为 null 有对应 hash 值 为 0;HashMap源码:public V put(K key, V value) return putVal(hash(key), key, value, fal

5、se, true);static final int hash(Object key) int h; return (key = null) ? 0 : (h = key.hashCode() (h 16); 3)HashTable 不能存储 null值/put():if (value = null) throw new NullPointerException();4)TreeMap TreeSet 不能存储 null值:null 不能调用 compareTo()方法if (key = null) throw new NullPointerException();1.概述key=valueM

6、ap分类: HashMap/TreeMap/HashTable/Properties1.Map 集合的特点 key-value Map中的key值,相当于是一个Set集合 无序且不能重复 Map中的value值,相当于一个Collection 可以重复,顺序是按照key值方法增 put(Object key,Object value); 新增 putAll(Map map); 批量新增删 remove(Object key);根据key值移除数据 remove(Object key, Object value) 根据key=value移除数据 clear();清空改 put(Object ke

7、y,Object value); key值一致,则value值覆盖之前的value值 replace(2, Oracle) 根据key值替换 map.replace(2, Oracle, SqlServer); 根据key=value替换查 size() 返回数据个数 isEmpty() 是否为空 containsKey(Object key) 是否包含指定key值 containsValue(Object value)是否包含指定value值 get(Object key); 根据key值获得value值遍历方式a.遍历keykeySet()方法:返回Map中所有的key值的Set集合Set

8、 keys = map.keySet();/返回map中所有的key值for (Object object : keys) System.out.println(object); System.out.println(map.get(object);b.遍历valuevalues()方法:返回Map中所有value的CollectionList:包含重复值public Collection values() Collection values = map.values();/获得map中所有的value值 for (Object object : values) System.out.prin

9、tln(object);c.entrySet():获得map集合中key=value的值(Map.Entry 内部类) getKey() getValue()Set entrySet = map.entrySet();/获得map集合中key=value的值for (Object object : entrySet) /entrySet中的每一个对象的实际类型是什么? Map.Entry entry=(Map.Entry)object; System.out.println(entry.getKey(); System.out.println(entry.getValue(); System.

10、out.println(object);HashMapJDK8及之后:数组 + 链表/红黑树JDK7:数组 + 链表1.源码分析:以JDK8为例步骤:创建HashMap对象时,table数组并没有初始化,仅仅只是将加载因子loadFactor初始化0.75当添加元素时, 如果是第一次添加元素时,table数组初始化容量为16,临界值threshold初始化12(16*0.75) 否则直接添加,先根据哈希值获取存放的索引,如果没有,直接添加。 如果有元素,需要解决冲突,然后添加。当每次添加元素时,先判断sizethreshold,如果大于,则需要扩容扩容倍数:2倍2.hash方法的原理: 方法原

11、型:return (key = null) ? 0 : (h = key.hashCode() (h 16); 获取二次哈希值 然后通过运算得到存放的桶的索引: tabi = (n - 1) & hash)3.put方法的原理: 调用putVal(hash(key),key,value,true,true)先判断是否为第一次添加, 如果是第一次添加,调用resize方法,进行table初始化.然后进行下一步 容量为16,临界值为12 如果不是第一次添加,直接进行下一步需要获取待添加元素的插入点(存放的索引): tabi = (n - 1) & hash)然后判断该索引处是否有元素: 如果没有元

12、素,则直接赋值 如果已经有元素,则需要根据以下情况进行判断: 情况1:判断二者的哈希值和地址|内容 是否相等,如果相等,则直接覆盖, 如果不相等,判断情况2 情况2:判断是否为树结构,然后根据树结构的特点进行冲突解决 情况3:判断是否为链表结构,然后根据链表结构的特点进行冲突解决判断+size临界值threshold,如果满足,则需要重新调用resize方法,进行2倍扩容 newCap = oldCap =8 & table的容量=64 ,才会转换核心代码: if (binCount = TREEIFY_THRESHOLD - 1) / -1 for 1st treeifyBin(tab, h

13、ash); if (tab = null | (n = tab.length) MIN_TREEIFY_CAPACITY)jdk7和jdk8源码的区别:整体结构: jdk7:数组+链表 jdk8:数组+链表+红黑树table的类型不一样 jdk7:Entry jdk8:Node创建对象时,对table的处理不一样 jdk7:table直接初始化容量为16 jdk8:table没有初始化,在第一次添加元素才进行初始化使用:将key的元素类型重写hashCode和equals,否则认为地址相等的两个key为重复元素HashtableHashMap是JDK1.2版本出现,Hashtable是JDK1.0版本出现TreeMap底层结构:红黑树特点:对添加到里面的元素进行自然排序(Comparable)或定制排序(Comparator)1. HashMap允许存储null键和null值;2. Hashtable不允许存储nu

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号