详解Map集合体系及方法entrySet、keySet、values
简单回顾Map集合:
Map表示映射关系,以键值对的方式来保存数据。key和value一一对应。key是唯一的,不可重复,而value是可重复的,可以被多个key关联。虽然Map是放入两个数据,但是却以key作为操作对象,value只是作为key的关联值。
通过查看,会发现Set与Map的实现类很相似,Set实现类的底层操作就是用Map来实现的,Set集的特性就来自于Map。唯一不同的就是Map表示一种映射关系,一次存储2个数据,Set只能存储单一数据。
Map体系中的主要类:
- HashMap:Map的典型实现,元素是无序且不可重复,这里的元素指的是key。
- LinkedHashMap:以插入的次序作为排序状态,其他的和HashMap一致。
- TreeMap:元素处于排序状态,可以使用自然排序也可以使用自定义排序,但key的类型必须一致,不然无法进行比较。
- Properties:Key-Value都是String类型,用于加载属性文件。后续会说到。
Map的重要方法和特点:
- entrySet()___返回一个包含所有映射关系的Set集合,该Set集合的类型为Map.Entry,一般用于迭代键值对。Map.Entry是一个内部接口。
- keySet()__..._返回该映射中所有key组成的Set集合。通过key获取键值对。
- values()___._返回该映射中所有value值。
- 这三个方法主要用于遍历键值对或直接获取value值,非常方便。但使用返回对象的方法时,会引发错误。代码示例和解析在最下面。
HashMap的代码示例
HashMap hm = new HashMap();
//放入键值对
hm.put("cn", "中国");
hm.put(1, 100);
hm.put("us", "美国");
hm.put("Ja", "日本");
hm.put("时间", new Date());
hm.put(1, 200);//用同一个key关联别的value
System.out.println(hm); //等同于hm.toString() System.out.println("----根据key获取关联的值------");
System.out.println(hm.get("Ja"));
System.out.println(hm.get(1)); System.out.println("----替换指定的键值对-------");
System.out.println(hm.replace(1, "100"));//返回被替换的value
System.out.println(hm.replace("us", "美国","FuckYou"));//返回boolean,表示是否替换成功 System.out.println("----删除指定键值对----");
System.out.println(hm.remove("Ja"));//返回被删除的value
System.out.println(hm.remove("Ja","日本"));//返回是否成功删除
LinkedHashMap简单示例
LinkedHashMap lhm = new LinkedHashMap();
lhm.put(1,"B");
lhm.put(4,"A");
lhm.put(3,"C");
lhm.put(2,"D");
System.out.println(lhm);
//输出:{1=B, 4=A, 3=C, 2=D}
LinkedHashMap就是以插入次序作为排序状态,别的和HashMap一致。非常类似于HashSet与LinkedHashSet的关系。
entrySet() 和 keySet() 和 values()的代码示例
以TreeMap为例,演示entrySet()
TreeMap tm = new TreeMap();
tm.put(1, "壹");
tm.put(3, "叁");
tm.put(6, "陆");
tm.put(7, "柒"); //使用迭代器来遍历元素
Set entrys = tm.entrySet();
Iterator it = entrys.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();//转换成Map.Entry类型
System.out.println(entry.getKey() +"-" + entry.getValue());
}
以TreeMap为例,演示keySet()
TreeMap tm = new TreeMap();
tm.put(1, "壹");
tm.put(3, "叁");
tm.put(6, "陆");
tm.put(7, "柒"); Set k = tm.keySet();
Iterator it = k.iterator();
//mode 1
while(it.hasNext()) {
Object key = it.next();//获取key
System.out.println(key + "->" + tm.get(key));
}
//mode 2
for(Object key : k) {
System.out.println(key +"->" + tm.get(key));
}
以TreeMap为例,演示values()
TreeMap tm = new TreeMap();
tm.put(1, "壹");
tm.put(3, "叁");
tm.put(6, "陆");
tm.put(7, "柒");
Collection value = tm.values();
for(Object v : value) {
System.out.println(v);
}
entrySet() keySet() 和 values()返回对象中的操作方法
TreeMap tm = new TreeMap();
tm.put(1, "壹");
tm.put(3, "叁");
tm.put(6, "陆");
tm.put(7, "柒");
Set entry = tm.entrySet();
Set key = tm.keySet();
Collection value = tm.values(); // entry.add("A");引发不支持的操作异常
System.out.println(entry.remove(1));//false
System.out.println(entry.contains(3));//false System.out.println(key.remove(1));//true
System.out.println(key.contains(3));//true System.out.println(value.remove("壹"));//false
上面代码中,可以看出无论是返回Set对象还是Collection,添加元素都会引发不支持的操作异常。这是因为返回的集合对象本质上依然是对键值对操作。它们的不同之处:
values()中只有value值,没有key,value值是没什么用的,所以values()方法也仅仅是获取所有value值方便。
方法中如果没有参数,不涉及到对键值对进行的操作,都是可以使用的。例如Iterator()、clear()、size()和isEmpty()等。
entrySet() 和 keySet() 和 values()的使用总结:
- 一般只使用它们的迭代器,用于获取所有键值对。
- 除了迭代器,对元素进行操作的方法不建议使用,容易出错。
- 如果要高效遍历key-value,建议使用entrySet(),keySet()也可以做到,但需要通过key来获取value,多增加了一步。
- 获取所有key就使用keySet(),获取所有value就使用values()
详解Map集合体系及方法entrySet、keySet、values的更多相关文章
- 详解 Map集合
(请关注 本人"集合总集篇"博文--<详解 集合框架>) 首先,本人来讲解下 Map集合 的特点: Map集合 的特点: 特点: 通过 键 映射到 值的对象 一个 映射 ...
- java如何对map进行排序详解(map集合的使用)
今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排 ...
- Map集合中的方法
Map集合中的方法: values() 方法 : 获取集合中的所有的值----没有键,没有对应关系, KeySet() 方法: 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代 ...
- Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计
在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...
- ubuntu apache2配置详解(含虚拟主机配置方法)
ubuntu apache2配置详解(含虚拟主机配置方法) 在Windows下,Apache的配置文件通常只有一个,就是httpd.conf.但我在Ubuntu Linux上用apt-get inst ...
- 详解Java中的clone方法
详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...
- 分区工具parted的详解及常用分区使用方法【转】
来源:http://blog.51cto.com/zhangmingqian/1068779 分区工具parted的详解及常用分区使用方法 一. parted的用途及说明 概括使用说明 ...
- Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法
Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法: https://blog.csdn.net/mingjie1212/article/details/485250 ...
- (转)linux命令详解之useradd命令使用方法
linux命令详解之useradd命令使用方法 原文:http://blog.csdn.net/u011537073/article/details/51987121 Linux 系统是一个多用户多任 ...
随机推荐
- C++ 多线程编程实例【2个线程模拟卖火车票的小程序】
原文:http://blog.csdn.net/chen825919148/article/details/7904219 核心提示:从网上搜集来的非常基础的C++多线程实例,刚入门的可以看看,希望能 ...
- MUI框架-06-静态页制作(图片轮播)
MUI框架-06-静态页制作(图片轮播) 轮播也是静态,是相对页面交互来说 上一篇介绍了如何设计一个简单的界面,还没有接触过,请先查看: MUI框架-01-介绍-创建项目-简单页面 轮播组件 之前也介 ...
- 下载 github 项目文件到本地方法
下载 github 项目文件到本地方法 本篇终极,收集 3 种方法 最厉害 666 的方法 直接访问网站: 操作如下: 本地工具版下载方法 首先需要下载 git 客户端 我就不转载了,上面有客户端的使 ...
- 移动端App开发 - 02 - iPhone/iPad/Android UI尺寸规范
移动端app开发 - iPhone/iPad/Android UI尺寸规范 本笔记抛去无用的前期分析什么的,全是干货,简洁干练 本笔记不单独针对 ios 或者 Android,两种都介绍,当然我们实际 ...
- sqlserver变量的生周期
在声明一个变量后,一旦遇到分号或者go,生命周期就结 DECLARE @num1 int --go ; --go print @num1; --print @num1:
- 软工读书笔记 week2
<程序员修炼之道>这本书后面一部分则是更深入.更具体.更细致地就程序员应该注意的事项做一些讨论,书中说的很多在过去的经历中都有较深的体会,同时也给了我很多启发.以下是一些我感悟较深的点: ...
- 使用mybatis plus自动生成controller、service、dao、mapper、entity代码
官网:http://mp.baomidou.com(这个项目不仅仅可以用于代码生成,还有分页等其他功能,是对mybatis的一层封装) 要求:基于sql自动生成domain.controller.se ...
- Oracle11g服务详细介绍及哪些服务是必须开启的
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/DaisyLoveZly/article/details/79463713 七个服务的含义分别为:1. ...
- APRoundedButton
APRoundedButton https://github.com/elpsk/APRoundedButton 效果: 源码: APRoundedButton.h // // Created by ...
- ubuntu13.04更新源
最近163的源出问题了,又要换一次源. 报错如下: 查更新源的命令查了好多次,这次还是记下来吧,估计以后还会用到很多次. 常规来说,是要先备份的,不过感觉备份也没什么用,所以就直接跳过吧.. 1 打 ...