二十二.Map
1.作用:
存储一组键值对应的数据类型的数据
2.方法
名称
键:key 值:value
体系结构
Map HashMap 特点:使用键值对的中键的hashcode值进行排序,允许空键空值,JDK1.2,线程不安全的 Hashtable 特点:使用键值对的中键的hashcode值进行排序,不允许空键空值,JDK1.0,线程安全的 TreeMap 特点:要求键要么拥有比较性,要么指定key的比较器 Properties 特点:HashMap的子类,可以加载读取文件中的内容,也可以向文件中写入内容 注意: key值不能重复
Map提供的方法
增 V put(K key, V value); 作用:添加 注意: 如果map中不存在该key,返回值为null 如果map中存在该key那么此时就是替换,返回被替换的值 void putAll(Map<? extends K, ? extends V> m); 作用:添加一组键值对 删 V remove(Object key); 作用:通过key删除指定的键值对 返回值:被删除的值 void clear(); 作用:清空 查 int size(); 作用:查询map中键值对的个数 boolean isEmpty(); 作用:判断是否为空map boolean containsKey(Object key); 作用:判断是否包含指定的key boolean containsValue(Object value); 作用:判断是否包含指定的value V get(Object key); 作用:获取key指定的值 Set<K> keySet(); 作用:获取所有key的集合 Collection<V> values(); 作用:获取所有值的集合 Set<Map.Entry<K, V>> entrySet(); 作用:获取所有键值对的集合 改 V put(K key, V value); 注意:如果存储数据时,key已经存在,此时就是修改**Map接口的遍历方式**
3.特点:
1.Map和collection并列存在,用于保存具有映射关系的数据Key-Value
2.Map中的Key和Value可以是任何引用数据类型,会封装到HashMap&$Node对象中
3.Map中的Key不允许重复,有相同的key时,采用替换机制,新出现的替换已有的,原因和HashSet一样
4.Map中value可重复
5.Map的key可以为null,value也可以为null,key只能有一个null,value为null可以有多个
6.常用的String类可作为Map的key
7.key和value之间存在一对一关系,及通过指定可以总能找到对应的value。
4.Map接口的遍历方式
Map map=new HashMap();
map.put("舒克","贝塔");
map.put("李大头","李大脑袋");
map.put("郭德纲","于谦");
map.put("岳云鹏","孙越");
map.put(null,"kk");
map.put("king",null);
System.out.println("===========第一种遍历===========");
//第一种遍历,先取出所有的Key,再通过Key取出对应的value
Set keyset = map.keySet();
//(1)增强for
for (Object key :keyset) {
System.out.println(key+"-"+map.get(key));
}
//(2)迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
System.out.println("===========第二种遍历===========");
//第二种,把所有的value取出
Collection values = map.values();
//可以使用collection使用的所有遍历方式
//(1)迭代器
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()) {
Object value = iterator1.next();
System.out.println(value);
}
//(2)for增强
for (Object o :values) {
System.out.println(o);
}
System.out.println("============第三种遍历============");
//第三种遍历方式,通过EntrySet获取
Set entryset = map.entrySet();
//(1)增强for
for (Object entryset1 :entryset) {
//将entryset1转成Map.entry
Map.Entry m=(Map.Entry) entryset1;
System.out.println(m.getKey()+"-"+m.getValue());
}
//(2)迭代器
Iterator iterator2 = entryset.iterator();
while (iterator2.hasNext()) {
Object next = iterator2.next();
//将iterator2转成Map.entry
Map.Entry m1=(Map.Entry) next;
System.out.println(m1.getKey()+"-"+m1.getValue());
}
5.开发中如何选择集合实现类*
-
/*开发中如何选择集合实现类** 1. **先判断存储的类型(一组对象或一组键值对)** 2. **一组对象(单列):collection接口** **允许重复:List** **增删多:LinkedList 底层维护了一个双向链表** **改查多:ArrayList 底层维护Object类型的可变数组** **不允许重复 Set** **无序:HashSet 底层是HashMap 维护了一个哈希表即数组+链表+红黑树** **排序:TreeSet** **插入和取出顺序一致:LinkedHashSet,维护数组+双向链表** 3. **一对键值对(双列):Map** **键无序:HashMap 底层是:哈希表 jdk7:数组+链表 jdk8:数组+链表+红黑树** **键排序:TreeMap **键插入和取出顺序一致:LinkedHashMap **读取文件:Properties */
6.扩容机制
**扩容机制:** 1. HashMap底层维护了Node类型的数组table,默认为nll 2. 当创建对象时,将加载因子(loadfactor)初始化为0.75 3. 当添加key-value时,通过key的哈希值得到table的索引,然后判断该索引处是否有元素,如果没有元素直接添加,如果该索引处有元素,判断钙元素的key是否和准备加入的key相等,如果相等,则直接替换val:如果不相等需要判断是树结构还是链表结构,做出相应的处理,如果添加时发现容量不够,则需要扩容 4. 第一次添加,则需要扩容table容量为16,临界值为12 5. 以后再扩容,则需要扩容table容量为原来的2倍32,临界值为原来的2倍,即24,以此类推 6. 在java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认为8),并且table的大小>=MIN_TREEIFY_CAPACITY(默认64)就会进行树化
7.HashTable
1. 存放的元素时键值对 k-v 2. hashtable的键和值都不能为空 3. hashtable使用方法和HashMap基本一样 4. hashtable是线程安全的 5. hashtable底层有数组hashtable$Entry[]初始值为11,threshold=8 6. 扩容按照自己的扩容机制进行 7. 扩容时执行addEntry(hash,key,value,index);添加一个k-v封装在Entry 8. 当count>=threshold时就进行扩容 9. 新的扩容时 (旧容量<<1)+1
8.Properties
-
properties类继承自hashtable类并且实现了Map接口,也是使用一种键值对的形式保存数据
-
使用特点和hashtable类似,不能有空的键和空的值
-
properties可以用于从 xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改
-
说明xxx.properties文件通常作为配置文件
9.collection工具类
- Collections是一个操作Set、List、Map等集合的工具类
- Collections中提供了一系列静态的方法对集合元素进行排序、查询、修改等操作
- 排序操作:(均为static方法)
- resverse(List):反转List中元素的顺序
- shuffle(List):对List集合元素进行随机排序
- sort(List):根据元素的自然顺序对指定的lisdt集合元素按升序排序
- sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
- swap(List,int,int):将指定list集合中i处元素和j处元素进行交换
4.查找,替换
- Object max(Collection):根据元素的自然顺序,返回给的集合中最大的元素
- Object max(Collection,Comparator)根据Comparator指定的顺序,返回给定集合中最大的元素4
- Object min(Collection)
- Object min(Collection,Comparator)
- int frequency(Collection,Object)将返回指定集合中指定元素出现的次数
- void copy(List dest,List dest)将src中的内容复制到dest中
- boolean replaceAll(List list,Object oldVal,Object newVal)使用新值替换List对象的所有旧值