map循环遍历取值_Collection集合框架集和map

Collection集合框架集

6d8c4859c799fcff9caff70c7ea00840.png

Java培训之Collection集合框架集

Map

Map概述

  • Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
  • Map 中的 key 和 value 都可以是任何引用类型的数据
  • Map 中的 key 不允许重复
  • key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。
  • Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和Properties。
  • HashMap是 Map 接口使用频率最高的实现类。
  • 允许使用null键和null值,与HashSet一样,不保证映射的顺序。

Map的常用方法:

1、添加、删除操作:

  • Object put(Object key,Object value)
  • Object remove(Object key)
  • void putAll(Map t)
  • void clear()

2、元素查询的操作:

  • Object get(Object key)
  • boolean containsKey(Object key)
  • boolean containsValue(Object value)
  • int size()
  • boolean isEmpty()

3、元视图操作的方法:

  • Set keySet()
  • Collection values()
  • Set entrySet()

Map的遍历

Collection集合的遍历:(1)foreach(2)通过Iterator对象遍历

Map的遍历,不能支持foreach

(1)分开遍历:单独遍历所有key,还可以根据key获取对应value

单独遍历所有value

(2)成对遍历:遍历的是映射关系Map.Entry

Map.Entry是Map接口的内部接口。每一种Map内部有自己的Map.Entry的实现类

在Map中存储数据,实际上是将Key—->value的数据存储在Map.Entry接口的实例中,再在Map集合中插入Map.Entry的实例化对象,如图示:

331b6c617979a5f3747dde8568a370a7.png

public static void main(String[] args) {

Map map = new HashMap();

map.put(“邢涛”, 60);

map.put(“林明明”, 70);

map.put(“田杰”, 80);

map.put(“李铠”, 90);

map.put(“李信”, 60);

System.out.println(“map的所有key:”);

Set keys = map.keySet();//HashSet

for(Object key : keys){

System.out.println(key+”->”+map.get(key));

}

System.out.println(“map的所有的value:”);

Collection values = map.values();

Iterator iter = values.iterator();

while(iter.hasNext()){

System.out.println(iter.next());

}

System.out.println(“map所有的映射关系:”);

//映射关系的类型是Map.Entry类型,它是Map接口的内部接口

Set mappings = map.entrySet();

for(Object mapping : mappings){

//System.out.println(mapping);

Map.Entry entry = (Map.Entry)mapping;

System.out.println(“key是:”+ entry.getKey()+ “,value是:”+entry.getValue());

}

}

Map的实现类

1、HashMap

HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。

HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。

HashMap线程不安全

JDK1.8之前:

HashMap的内部存储结构其实是数组和链表的结合。当实例化一个HashMap时,系统会创建一个长度为Capacity的Entry数组,这个长度在哈希表中被称为容量(Capacity),在这个数组中可以存放元素的位置我们称之为“桶”(bucket),每个bucket都有自己的索引,系统可以根据索引快速的查找bucket中的元素。

每个bucket中存储一个元素,即一个Entry对象,但每一个Entry对象可以带一个引用变量,用于指向下一个元素,因此,在一个桶中,就有可能生成一个Entry链。而且新添加的元素作为链表的head。

a4ba6f7e28cf42cbb54a8a836dd75154.png

HashMap的扩容

当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询的效率,就要对HashMap的数组进行扩容,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize。

那么HashMap什么时候进行扩容呢?

当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数size)*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

JDK1.8之后:

HashMap的内部存储结构其实是数组和链表/树的结合。当实例化一个HashMap时,会初始化initialCapacity和loadFactor,在put第一对映射关系时,系统会创建一个长度为initialCapacity的Node数组,这个长度在哈希表中被称为容量(Capacity),在这个数组中可以存放元素的位置我们称之为“桶”(bucket),每个bucket都有自己的索引,系统可以根据索引快速的查找bucket中的元素。

每个bucket中存储一个元素,即一个Node对象,但每一个Node对象可以带一个引用变量next,用于指向下一个元素,因此,在一个桶中,就有可能生成一个Node链。也可能是一个一个TreeNode对象,每一个TreeNode对象可以有两个叶子结点left和right,因此,在一个桶中,就有可能生成一个TreeNode树。而新添加的元素作为链表的last,或树的叶子结点。(七上八下)

c4cc00deaa0e89a01c5d7e9bd9198814.png

那么HashMap什么时候进行扩容和树形化呢?

当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数size)*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

当HashMap中的其中一个链的对象个数如果达到了8个,此时如果capacity没有达到64,那么HashMap会先扩容解决,如果已经达到了64,那么这个链会变成树,结点类型由Node变成TreeNode类型。当然,如果当映射关系被移除后,下次resize方法时判断树的结点个数低于6个,也会把树在转为链表。

关于映射关系的key是否可以修改?

映射关系存储到HashMap中会存储key的hash值,这样就不用在每次查找时重新计算每一个Entry或Node(TreeNode)的hash值了,因此如果已经put到Map中的映射关系,再修改key的属性,而这个属性又参与hashcode值的计算,那么会导致匹配不上。

HashSet的底层实现

public class HashSet<E> ……{

private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();

public HashSet() {

map = new HashMap<>();

}

public HashSet(int initialCapacity, float loadFactor) {

map = new HashMap<>(initialCapacity, loadFactor);

}

public HashSet(int initialCapacity) {

map = new HashMap<>(initialCapacity);

}

public Iterator<E> iterator() {

return map.keySet().iterator();

}

public int size() {

return map.size();

}

public boolean isEmpty() {

return map.isEmpty();

}

public boolean contains(Object o) {

return map.containsKey(o);

}

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

public void clear() {

map.clear();

}

}

2、LinkedHashMap

LinkedHashMap 是 HashMap 的子类

与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致

3、TreeMap

TreeMap存储 Key-Value 对时,需要根据 key进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态。

TreeMap 的 Key 的排序:

自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException

定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。

TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。

若使用自定义类作为TreeMap的key,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0。

4、Hashtable

Hashtable是个古老的 Map 实现类,线程安全。

与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value

与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序

Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。

5、Properties

Properties 类是 Hashtable 的子类,该对象用于处理属性文件

由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型

存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法

Map集合框架集

32d3aa16ddd2780c474c872e417a9a48.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php查询字段前30个字符,php/json我的字段名被截断为30个字符。我能停下来吗?

好吧,我得到了一个供应商软件,他们说应该在ApachePHP服务器和MySQL数据库上运行。我没有这两个,所以我把它放在一个php-iis服务器上,并将代码转换为在SQL服务器上工作。前任。mysql_select_db->mssql_select_db(除其他外)所以我在一个PHP文件中有以下代码$query "SELE…

rserve php,使用Rserve远程执行R脚本

Rserve介绍Rserve是一个基于TCP/IP协议的&#xff0c;允许R语言与其他语言通信的C/S结构的程序&#xff0c;支持C/C,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接&#xff0c;认证&#xff0c;文件传输等功能。我们可以设计R做为后台服务&#xff0c;处理统计建模&…

搜索引擎提交软件_搜索引擎优化的发展史及SEO前景展望

SEO 是随着搜索引擎的普及而出现&#xff0c;并伴随搜索引擎的发展而发展的。关于搜索引擎和搜索引擎优化SEO 最初是怎么诞生的有很多种说法。有一个非常有趣的事实是&#xff0c;最早的一批SEO 甚至可以追溯到Yahoo 出现之前&#xff0c;我们可以把Yahoo 的传世人David Filo 和…

mongodb模糊查询_MongoDB的CRUD基本操作

原创&#xff1a;牛津小马哥Python后端工程师小李哥。在上周的推文中&#xff0c;我们介绍了MongoDB的数据库和集合的操作&#xff0c;现在&#xff0c;让我们来继续学习mongodb的另一个操作&#xff1a;CRUDCRUD操作&#xff1a;创建、读取、更新、删除文档。创建操作&#xf…

java有关问题,java经典有关问题!

java经典问题&#xff01;&#xff01;&#xff01;问题一&#xff1a;与equal的区别&#xff1f;和 equals 都是比较的,而前者是运算符,后者则是一个方法,基本数据类型和引用数据类型都可以使用运算符,而只有引用类型数据才可以使用 equals,下面具体介绍一下两者的用法以及区别…

python怎么创业_python创业

从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I/O&#xff0c;OLAP&#xff0c;Web开发&#xff0c;高性能网络通信&#xff0c;测试&#xff0c;爬虫等。Django:PythonWeb应用开发框架Django应该是最出名的Python框架&#xff0c;GAE甚至Erlang都有框架受…

python开发需要什么基础_零基础学习Python需要用什么开发工具?

对于学习Python的小伙伴&#xff0c;小编首推的Pycharm。首先&#xff0c;PyCharm用于一般IDE具备的功能&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制另外&#xff0c;PyCharm还提供了一些很好的功能用于Djan…

php send helo/ehlo first错误,phpmailer发送邮件提示SMTP server error怎么回事?

以下是我的代码错误提示信息为&#xff1a;SMTP server error: Error: send HELO/EHLO first如果把SMTPAuth改为true&#xff0c;错误为SMTP Error: Could not authenticate. Mail errorSMTP Error: Could not authenticate.请教大神是什么原因&#xff1f;是不是还需要哪些设置…

python elasticsearch_python elasticsearch模块使用

加载模块from elasticsearch import Elasticsearch连接ESes Elasticsearch(["172.30.6.12"])查询res es.search(index"test-index", body{"query":{"match_all":{}}})# 查询请求主机是ai.baidu.com 所有信息res es.search(index&qu…

php ci model条件查询,php – CodeIgniter中的多条件WHERE子句

我想删除一些像核心PHP中的查询这样的数据WHERE user_id$id AND sender_id$send_id OR user_id$send_id AND sender_id$id所以我在CodeIgniter中尝试使用Active Record,如下所示&#xff1a;$this->db->where(user_id ,$id);$this->db->or_where(user_id ,$send_id…

python语言打印菱形_Python 实现打印单词的菱形字符图案

Python 实现打印单词的菱形字符图案我就废话不多说了&#xff0c;还是直接看代码吧&#xff01;a [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1]b [ * 2 * (7 - i) Good * i for i in a]for line in b:print(line)程序运行结果如下&#xff1a;补充知识&#xff1a;python打印菱…

java快捷键查看目录,java取得快捷方式指向的路径

当前位置:我的异常网 行业应用 java取得快捷方式指向的路径java取得快捷方式指向的路径www.myexceptions.net 网友分享于&#xff1a;2013-08-17 浏览&#xff1a;5次java获得快捷方式指向的路径import java.io.ByteArrayOutputStream;import java.io.File;import java.io.F…

python 编程算法_python语言编程算法

编程题1 台阶问题/斐波那契一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。fib lambda n: n if n < 2 else fib(n - 1) fib(n - 2)第二种记忆方法def memo(func):cache {}def wrap(*args):if args not in cache:cac…

php邮件中文乱码,phpmailer 发送邮件中文乱码问题的解决方法总结

$mail new PHPMailer();复制代码2&#xff1a;设置邮件的编码&#xff1b;$mail->CharsetUTF-8;复制代码相信有不少朋友是设置成"GBK"或“GB2312”的&#xff0c;我开始也是&#xff0c;后来了解到Mail是国际化的&#xff0c;如果想在像Gmail等那样的国际化邮箱正…

python白森_氧气恋人小说-江白森修辞在线阅读-829阅读网

江白森002.再次见到江白森的时候是三天后&#xff0c;也就是军训的第二天。晚间的时候&#xff0c;以小组为单位举行篝火晚会。修辞坐在树枝堆前&#xff0c;看着堆积的树枝霎时间被点燃&#xff0c;火光一瞬间炸裂&#xff0c;越来越旺。树堆那边的人像是在火中沐浴一般&#…

php代码加文件后缀,php中一行代码获取文件后缀名

...quot; 在字符串中最后一次出现的位置&#xff1a;<?php echo strrpos("I love php, I love php too!","php");?>定义和用法strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分php strrpos()函数用于查找字符串在另一字符串中最后一…

设计一个程序实现两个任意长的整数的求和运算_自然数集,整数集,有理数集等都有字母表示,为什么无理数集没有...

在网上翻到一个非常有意思的问题&#xff1a;这个问题乍看起来无厘头&#xff0c;但实际上是个非常深刻的问题&#xff0c;涉及到抽象代数(abstract algebra)的一些基本概念&#xff0c;因此我打算写篇文章来详细阐述一下。人类的数学从数数开始&#xff0c;最早诞生的概念是自…

php7 str split,PHP7.4新特性预览

虽然PHP 7.4还未发布&#xff0c;但是RFC已经确定了该版本的一些新性。这个版本的改动有点多&#xff0c;有很多实用性功能。发布日期可能在2019年12月左右&#xff0c;但尚待确认。让我们看看有那些地方的改动。短闭包 RFC属性类型定义 RFCNull Coalescing Assignment Operato…

python实现中撤销上一步的代码mac_一个“MacBook”新手的Python“笨办法”自学之旅 #第六章:常用的简易Python命令、符号、代码、格式化字符串...

第六章&#xff1a;常用的简易Python命令、符号、代码、字符串《“笨办法”学Python》这本书中&#xff0c;确实用了较多篇幅来介绍Python的一些常用简单的命令、符号、代码和字符串等&#xff0c;对于像我这样的自学新手&#xff0c;真的是非常棒&#xff0c;因为它们可以帮我…

php strpo函数,php strpos函数有什么用

php strpos函数有什么用&#xff1f;定义和用法strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。注释&#xff1a;strpos() 函数是区分大小写的。注释&#xff1a;该函数是二进制安全的。相关函数&#xff1a;strrpos() - 查找字符串在另一字符串中最后一…