Java---- -Map集合的概论及应用、Collections工具类的使用

Map集概论

通过我们查询API文档得到官方说名来了解一下:

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。 Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,HashMap 类。 注:将可变对象用作映射键时必须格外小心。当对象是映射中某个键时,如果以影响 equals 比较的方式更改了对象的值,则映射的行为将是不确定的。此项禁止的一种特殊情况是不允许某个映射将自身作为一个键包含。虽然允许某个映射将自身作为值包含,但请格外小心:在这样的映射上 equals 和 hashCode 方法的定义将不再是明确的。
通过以上,我们来解析一下获取关于Map的关键信息:
Map(映射):
  Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。
  Map没有继承于Collection接口
  从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

Map实现的方法

Map 的常用方法:
  1 添加,删除操作:
  Object put(Object key, Object value): 向集合中加入元素
  Object remove(Object key): 删除与KEY相关的元素
  void putAll(Map t): 将来自特定映像的所有元素添加给该映像
  void clear(): 从映像中删除所有映射
  2 查询操作:
  Object get(Object key): 获得与关键字key相关的值
  Map集合中的键对象不允许重复,也就说,任意两个键对象通过equals()方法比较的结果都是false.
  但是可以将任意多个键独享映射到同一个值对象上。
Map的功能方法
  方法put(Object key, Object value)添加一个“值”(想要得东西)和与“值”相关联的“键”(key)(使用它来查找)。方法get(Object key)返回与给定“键”相关联的“值”。可以用containsKey()和containsValue()测试Map中是否包含某个“键”或“值”。

Map实现的几种重要的类

标准的Java类库中包含了几种不同的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它们都有同样的基本接口Map,但是行为、效率、排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
  
  而这个执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜索“键”是相当慢的。而这正是HashMap提高速度的地方。HashMap使用了特殊的值,称为“散列码”(hash code),来取代对键的缓慢搜索。“散列码”是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都能产生散列码,因为hashCode()是定义在基类Object中的方法。
  HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显着提高性能。
  Map : 维护“键值对”的关联性,使你可以通过“键”查找“值”
  HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
  LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
  TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
  WeakHashMap : 弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
  IdentifyHashMap : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计

Map的两种遍历方式

从以上的论述我们都知道了,这个Map集合就是一种映射的关系,我们可以在里面存储键值对,这些键值对一一对应,一个键只能对应一个值,键不允许重复,通过Map的常用方法 中我们可以通过

Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
  V get(Object key):根据键获取值


  Set<K> keySet():获取集合中所有键的集合
  Collection<V> values():获取集合中所有值的集合
  

这两个方法来进行Map集合的 遍历

方式一:

import java.util.Map;
import java.util.Set;

public class hashmaptest {
    public static void main(String[] args) {
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("小明","男");
        objectObjectHashMap.put("小花","女");


        Set<Map.Entry<String, String>> entries = objectObjectHashMap.entrySet();

        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey() + "  " + entry.getValue());
        }
        }
    }

输出结果:
在这里插入图片描述
方式二:

	 import java.util.Set;

public class hashmaptest {
    public static void main(String[] args) {
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("小明","男");
        objectObjectHashMap.put("小花","女");


        Set<String> strings = objectObjectHashMap.keySet();
    for (String string : strings) {
        String s = objectObjectHashMap.get(string);
        System.out.println(string+"  "+s);
    }

}
}

输出结果:
在这里插入图片描述

这样,我们就完成了两个集合的遍历。
这里我们再来看看两个集合嵌套遍历
我们可以通过嵌套集合的遍历再控制台输出以下内容:

 传智播客
        jc   基础班
               张三       20
               李四       22
        jy   就业班
              王五    21
               赵六    23

代码:

import java.util.HashMap;
import java.util.Set;

public class qiantao {
    public static void main(String[] args) {
    HashMap<String, Integer> jc = new HashMap<>();
        HashMap<String, Integer> jy = new HashMap<>();
        jc.put("张三",20);
        jc.put("李四",22);
        jy.put("王五",21);
        jy.put("赵六",23);
        HashMap<HashMap<String,Integer>,String>max=new HashMap<>();
        max.put(jc,"基础班");
        max.put(jy,"就业班");
        Set<HashMap<String, Integer>> hashMaps = max.keySet();
        System.out.println("智客传播");
        int i=1;
        for (HashMap<String, Integer> hashMap : hashMaps) {
            if (i==1){System.out.println("jc"+"----"+max.get(hashMap));}
            else{System.out.println("jy"+"----"+max.get(hashMap));}
            i++;
            Set<String> strings = hashMap.keySet();
            for (String string : strings) {
                System.out.println("   "+string+"   "+hashMap.get(string));
            }
        }

    }

}

输出结果:

在这里插入图片描述

Collections工具类的使用

Collections类概述: 针对集合操作 的工具类

Collections成员方法
public static void sort(List list): 排序,默认按照自然顺序
public static int binarySearch(List<?> list,T key): 二分查找
public static T max(Collection<?> coll): 获取最大值
public static void reverse(List<?> list): 反转
public static void shuffle(List<?> list): 随机置换
** Collection和Collections的区别:**
1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。声明了适用于JAVA集合(只包括Set和List)的通用方法。Set 和List 都继承了Conllection,Map没有.
2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务JavaCollection框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值