java中阶之Map

在这里插入图片描述

二十二.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.  /*开发中如何选择集合实现类**
    
    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

  2. properties类继承自hashtable类并且实现了Map接口,也是使用一种键值对的形式保存数据

  3. 使用特点和hashtable类似,不能有空的键和空的值

  4. properties可以用于从 xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改

  5. 说明xxx.properties文件通常作为配置文件

9.collection工具类

  1. Collections是一个操作Set、List、Map等集合的工具类
  2. Collections中提供了一系列静态的方法对集合元素进行排序、查询、修改等操作
  3. 排序操作:(均为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对象的所有旧值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半糖不加奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值