知识点
Map集合基础,练习
-
Map存储数据的特点是什么?
Map集合的特点
-
键值对映射关系
-
一个键对应一个值
-
键不能重复,值可以重复
-
元素存取无序
-
-
描述HashMap的底层实现原理(jdk 8版)?
首先看数据结构,jdk8之前是数组加链表。Jdk8加入了红黑树。(为了避免链表过长产生循环链表)。 对于添加,同一个索引位置的节点超过8个(阈值8)并且数组长度大于或者等于64链表会转为红黑树,小于64会进行扩容。 对于删除,同样一个索引位置的节点在移除之后达到6个(阈值6),并且该索引位置的节点为红黑树节点。红黑树会转为链表 然后最核心的是put方法和get方法。
-
Map中常用实现类有哪些?各自有什么特点?
HashMap,TreeMap,Hashtable以及LinkedHashMap
HashMap:HashMap的值是没有顺序的,按照key的HashCode来实现的,就是根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。
TreeMap: 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
Hashtable: 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,只有hashtable是继承自Dictionary抽象类的,hashMap和treeMap都继承自AbstractMap抽象类,LinkedHashMap继承自hashMap。
LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。
-
如何遍历Map中的key-value对,代码实现(至少2种)
//获取所有键值对对象的集合 Set<Map.Entry<String, String>> entrySet = map.entrySet(); //遍历键值对对象的集合,得到每一个键值对对象 for (Map.Entry me : entrySet) { //根据键值对对象获取键和值 String key = me.getKey(); String value = me.getValue(); System.out.println(key + "," + value); }
//2、先用keySet()取出所有key值,再取出对应value——增强for循环遍历*/ Set keyset = hashMap.keySet(); for(Object key:keyset){ System.out.println(key+"-"+hashMap.get(key)); }
-
Collection和Collections的区别?
Collection集合接口
Collections集合工具类
-
Map接口中的常用方法有哪些 ?
V put(K key,V value) 添加元素 V remove(Object key) 根据键删除键值对元素 void clear() 移除所有的键值对元素 boolean containsKey(Object key) 判断集合是否包含指定的键 boolean containsValue(Object value) 判断集合是否包含指定的值 boolean isEmpty() 判断集合是否为空 int size() 集合的长度,也就是集合中键值对的个数 V get(Object key) 根据键获取值 Set<K> keySet() 获取所有键的集合 Collection<V> values() 获取所有值的集合 Set<Map.Entry