- 浏览: 690524 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (302)
- 知识库 (51)
- lucene (8)
- 数据结构 (7)
- 问题及解决方法 (97)
- Quartz (4)
- JavaScript (26)
- java 基础 (40)
- 休闲 (9)
- 数据库相关 (32)
- 面试题 (4)
- Hibernate (5)
- Struts (11)
- JBPM (2)
- Spring (3)
- ajax (7)
- Flex (0)
- 报表 (4)
- 打印 (2)
- prototype (3)
- Struts2 (3)
- JQUERY (4)
- Ruby (0)
- Linux (9)
- Android (3)
- Objective-c (2)
- Python (8)
- map (1)
- mybatis (3)
- php (2)
- ios (0)
- 问题及解决方法 struts2 spring ognl resion tomcat (0)
- 问题及解决方法 struts2 spring ognl resin tomcat (1)
- c++ (2)
- 问题及解决方法 upload.parseRequest(request) 为空 (1)
- Eclipse maven tomcat (1)
- 知识库 服务器配置 (1)
- sersync2 (1)
- Maven Jetty Plugin 配置指南(翻译) (1)
最新评论
-
jgroups:
...
遇到Causedby:java.lang.NoClassDefFoundError:javax/validation/ParameterNameProvider -
dmyccc:
第二种方法还是很佩服楼主的,但是多少感觉有点投机取巧了。但是确 ...
spring mvc整合kindeditor文件上传问题 -
du_bo:
在xx-servlet.xml中这样配置<bean id ...
spring mvc整合kindeditor文件上传问题 -
java梦之翼:
太感谢了, 问题得到解决, 感谢
异常org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction -
du_bo:
这是我的上传package com.sp.controller ...
spring mvc整合kindeditor文件上传问题
java.util 中的集合类包含 Java 中某些最常用的类。 最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。 从概念上而言,您可以将 List 看作是具有数值键的 Map。 而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系。本文将着重介绍核心 Java 发行套件中附带的 Map,同时还将介绍如何采用或实现更适用于您应用程序特定数据的专用 Map。
了解 Map 接口和方法
Java 核心类中有很多预定义的 Map 类。 在介绍具体实现之前,我们先介绍一下 Map 接口本身,以便了解所有实现的共同点。 Map 接口定义了四种类型的方法,每个 Map 都包含这些方法。 下面,我们从两个普通的方法(表 1)开始对这些方法加以介绍。
表 1: 覆盖的方法。 我们将这 Object 的这两个方法覆盖,以正确比较 Map 对象的等价性。
equals(Object o) | 比较指定对象与此 Map 的等价性 |
hashCode() | 返回此 Map 的哈希码 |
Map 构建
Map 定义了几个用于插入和删除元素的变换方法(表 2)。
clear() | 从 Map 中删除所有映射 |
remove(Object key) | 从 Map 中删除键和关联的值 |
put(Object key, Object value) | 将指定值与指定键相关联 |
clear() | 从 Map 中删除所有映射 |
putAll(Map t) | 将指定 Map 中的所有映射复制到此 map |
尽管您可能注意到,纵然假设忽略构建一个需要传递给 putAll() 的 Map 的开销,使用 putAll() 通常也并不比使用大量的 put() 调用更有效率,但 putAll() 的存在一点也不稀奇。 这是因为,putAll() 除了迭代 put() 所执行的将每个键值对添加到 Map 的算法以外,还需要迭代所传递的 Map 的元素。 但应注意,putAll() 在添加所有元素之前可以正确调整 Map 的大小,因此如果您未亲自调整 Map 的大小(我们将对此进行简单介绍),则 putAll() 可能比预期的更有效。
查看 Map
迭代 Map 中的元素不存在直接了当的方法。 如果要查询某个 Map 以了解其哪些元素满足特定查询,或如果要迭代其所有元素(无论原因如何),则您首先需要获取该 Map 的“视图”。 有三种可能的视图(参见表 3)
- 所有键值对 — 参见 entrySet()
- 所有键 — 参见 keySet()
- 所有值 — 参见 values()
前两个视图均返回 Set 对象,第三个视图返回 Collection 对象。 就这两种情况而言,问题到这里并没有结束,这是因为您无法直接迭代 Collection 对象或 Set 对象。要进行迭代,您必须获得一个 Iterator 对象。 因此,要迭代 Map 的元素,必须进行比较烦琐的编码
Iterator keyValuePairs = aMap.entrySet().iterator();
Iterator keys = aMap.keySet().iterator();
Iterator values = aMap.values().iterator();
值得注意的是,这些对象(Set、Collection 和 Iterator)实际上是基础 Map 的视图,而不是包含所有元素的副本。 这使它们的使用效率很高。 另一方面,Collection 或 Set 对象的 toArray() 方法却创建包含 Map 所有元素的数组对象,因此除了确实需要使用数组中元素的情形外,其效率并不高。
我运行了一个小测试(随附文件中的 Test1),该测试使用了 HashMap,并使用以下两种方法对迭代 Map 元素的开销进行了比较:
int mapsize = aMap.size(); Iterator keyValuePairs1 = aMap.entrySet().iterator(); for (int i = 0; i < mapsize; i++) { Map.Entry entry = (Map.Entry) keyValuePairs1.next(); Object key = entry.getKey(); Object value = entry.getValue(); ... } Object[] keyValuePairs2 = aMap.entrySet().toArray(); for (int i = 0; i < rem; i++) { { Map.Entry entry = (Map.Entry) keyValuePairs2[i]; Object key = entry.getKey(); Object value = entry.getValue(); ... }
此测试使用了两种测量方法: 一种是测量迭代元素的时间,另一种测量使用 toArray 调用创建数组的其他开销。 第一种方法(忽略创建数组所需的时间)表明,使用已从 toArray 调用中创建的数组迭代元素的速度要比使用 Iterator 的速度大约快 30%-60%。 但如果将使用 toArray 方法创建数组的开销包含在内,则使用 Iterator 实际上要快 10%-20%。 因此,如果由于某种原因要创建一个集合元素的数组而非迭代这些元素,则应使用该数组迭代元素。 但如果您不需要此中间数组,则不要创建它,而是使用 Iterator 迭代元素。
表 3: 返回视图的 Map 方法: 使用这些方法返回的对象,您可以遍历 Map 的元素,还可以删除 Map 中的元素。
entrySet() | 返回 Map 中所包含映射的 Set 视图。 Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素 |
keySet() | 返回 Map 中所包含键的 Set 视图。 删除 Set 中的元素还将删除 Map 中相应的映射(键和值) |
values() | 返回 map 中所包含值的 Collection 视图。 删除 Collection 中的元素还将删除 Map 中相应的映射(键和值) |
访问元素
表 4 中列出了 Map 访问方法。Map 通常适合按键(而非按值)进行访问。 Map 定义中没有规定这肯定是真的,但通常您可以期望这是真的。 例如,您可以期望 containsKey() 方法与 get() 方法一样快。 另一方面,containsValue() 方法很可能需要扫描 Map 中的值,因此它的速度可能比较慢。
表 4: Map 访问和测试方法: 这些方法检索有关 Map 内容的信息但不更改 Map 内容。
get(Object key) | 返回与指定键关联的值 |
containsKey(Object key) | 如果 Map 包含指定键的映射,则返回 true |
containsValue(Object value) | 如果此 Map 将一个或多个键映射到指定值,则返回 true |
isEmpty() | 如果 Map 不包含键-值映射,则返回 true |
size() | 返回 Map 中的键-值映射的数目 |
对使用 containsKey() 和 containsValue() 遍历 HashMap 中所有元素所需时间的测试表明,containsValue() 所需的时间要长很多。 实际上要长几个数量级! (参见图 1 和图 2,以及随附文件中的 Test2)。 因此,如果 containsValue() 是应用程序中的性能问题,它将很快显现出来,并可以通过监测您的应用程序轻松地将其识别。 这种情况下,我相信您能够想出一个有效的替换方法来实现 containsValue() 提供的等效功能。 但如果想不出办法,则一个可行的解决方案是再创建一个 Map,并将第一个 Map 的所有值作为键。 这样,第一个 Map 上的 containsValue() 将成为第二个 Map 上更有效的 containsKey()。
发表评论
-
java 图片涂抹功能
2013-12-30 16:19 1799今天遇到一个问题,用户上传图片的时候,有些敏感信息 ... -
java 截取汉字字符串
2013-10-11 11:49 1706对于汉字的切分 1个 汉字 占用2个字符 不能切出半 ... -
Pytohon 安装 MySQLdb
2013-07-08 12:22 1339python 在windows 下安装 mysql ht ... -
unicode 和 汉字转换
2013-06-18 15:23 1543// unicode转为本地 public sta ... -
根据数据库表结构生成实体bean 包括 get set 方法和 注释
2012-11-27 09:52 1935根据数据库表结构生成 javaBean 。 这个功能以前一 ... -
powerdesigner 反向 显示问题
2012-10-31 16:20 1151pd 反向 1. )首先新建一个“PhysicalDa ... -
算法的力量:位运算在排序与搜索中的应用
2012-08-31 10:13 1356<转自: http://www.cnblogs.co ... -
各种排序
2012-08-20 16:32 983为了便于管理,先引入个基础类: package ... -
java 切图 按比例切图
2012-08-13 11:34 4431java 切图 public boolean scal ... -
JSP、JAVA获取各种路径总结
2012-07-17 15:12 03.1 JSP中获得当前应用的相对路径和绝对路径 根目 ... -
map 的三种遍历方法
2011-12-22 11:44 1188map 的遍历方法: import java.u ... -
MyEclipse里编辑的项目名的红叉,Java compiler level does not match the version of the instal
2011-11-14 10:15 4009一般出现在从别处import的项目上,只有项目文件夹上有红叉, ... -
jvm工作原理
2011-05-24 09:29 1172Java虚拟机 一、什 ... -
Java语法总结 - 内部类
2011-04-28 15:39 1028Java语法总结 - 内部类从Java1.1开始引入了内部类以 ... -
catalina.home和catalina.base这
2010-06-24 09:52 1986catalina.home和catalina.base ... -
运用BigDecimal精确计算
2010-06-09 11:09 1127问题的提出: ... -
java正则表达式
2010-04-14 09:37 1995java正则表达式通过java.util.regex包下的Pa ... -
正则表达式一
2010-03-31 14:32 1165则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的 ... -
cas 博文
2010-03-25 14:36 1110配置的比较详细的文章: http://blog.csd ... -
cas单点登录配置速成
2010-03-25 14:11 1448本文 转自 : http://www.blogjava.net ...
相关推荐
这种方法可以灵活地控制遍历过程,但需要注意的是,Iterator遍历需要使用hasNext()方法判断是否还有下一个元素。 4. 使用Iterator遍历EntrySet() 使用Iterator遍历EntrySet()可以获取Map集合中的所有键值对,然后...
2. 遍历键值对(entrySet):使用`entrySet()`方法获取键值对的集合,遍历每个`Map.Entry`对象,访问键和值。 ```java for (Map.Entry, String> entry : map.entrySet()) { System.out.println(entry.getKey() + " ...
假设我们有一个List,其中每个元素都是一个Map,我们可能需要遍历List并访问每个Map: ```java List<Map, String>> userList = new ArrayList(); for (Map, String> user : userList) { String userName = user....
为了解决这一问题,我们可以通过将数组转换为Map对象(即键值对集合),利用Map的高效键值查找特性来代替传统的数组遍历方法。下面将详细介绍如何在Vue.js中使用map来代替Array数组循环遍历。 首先,Vue.js中传统...
在Java编程中,Map接口是用于存储键值对的数据结构,它不保证元素的顺序,特别是HashMap类,其遍历顺序可能与插入顺序不同。然而,有时我们需要对Map中的值进行排序,例如按照value的大小进行升序或降序排列。这篇...
Map对象提供了一种高效的方式存储和检索数据,同时也允许我们获取Map中的元素数量,也就是key的数量。本篇文章将详细介绍如何使用JavaScript来获取Map中key的个数。 首先,我们需要了解Map对象的基本操作。创建一个...
Collection 集合的方法有:add(obj) 添加一个元素,remove(object) 删除一个元素,contains(object) 判断是否存在元素,isempty() 判断集合是否为空,size() 返回集合里面元素的个数,toarray() 将集合变为数组,...
它允许我们遍历集合中的元素。 Java 中提供了两种迭代器:Iterator 和 ListIterator。 1.3 List List 是一个接口,继承自 Collection。它提供了有序的集合操作。 1.3.1 概述 List 是一个有序的集合,它的元素...
Map存储的元素为键值对,通常称为key-value 而key是不允许重复的 Set存储对象唯一 二、掌握Map的常用方法 三、基本方法的使用 掌握上述的每个方法的应用(采用String,Integer等JDK已提供的引用数据类型),重点掌握...
遍历通常指的是按照特定顺序访问或处理数据结构中的每个元素,比如数组、链表、树或图等。在JavaScript中,遍历是处理数组和对象的常用方法,用于读取、修改或执行与元素相关的操作。 在JavaScript中,有多种遍历...
在JavaScript中,`Array.prototype.map()`是一个非常常用的数组方法,它创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后的返回值。然而,原生的`map()`函数是异步的,这意味着它不会阻塞执行其他...
因为map是无序的,遍历时不会按照插入顺序输出元素。如果需要有序遍历,可以先将map的键复制到切片中,然后对切片进行排序,最后遍历排序后的切片。 6. 清空map的方式有两种:一种是再次用make函数初始化(例如exp ...
这个方法的时间复杂度为O(n),因为每个元素只遍历一次。 在提供的压缩包文件中,`main.js`可能是实现这个功能的源代码,而`README.txt`可能包含了关于如何使用或测试这个功能的说明。通过阅读这些文件,你可以更...
总结来说,jQuery提供了丰富的数组处理功能,如`grep`用于筛选,`each`用于遍历,`inArray`用于查找元素位置,以及`map`用于转换数组元素。这些方法极大地提高了开发效率,使得处理数组和对象变得更加简洁和高效。在...
在上面的代码中,我们首先创建了一个HashSet,然后遍历原始List,使用add方法将元素添加到HashSet中,如果元素添加成功,则将其添加到新的List中,以达到去重的目的。 二、List排序操作 在Java中,我们可以使用...
然后使用`.each()`方法遍历所有具有`property`类的表单元素,将每个元素的`name`属性作为键,`value`属性作为值,存入`propertyMap`对象。最后,使用`JSON.stringify()`方法将这个对象转换为一个字符串,并通过`...
C语言实现的list可能通过结构体和指针来构建,包含节点的前驱和后继指针,提供插入、删除和遍历操作。 3. **Map**:C++的map是一个关联容器,它将键与值关联起来,并自动根据键进行排序。C语言实现的map可能基于...
此外,在 Java8 中,我们还可以使用 Stream 的其他方法来实现列表元素的属性求和操作,例如使用 map 方法来将列表中的元素转换成一个新的流,然后使用 reduce 方法来求和。 例如,我们可以使用以下代码来实现上述...
首先,我们可以使用for循环来遍历List,然后将每个元素转换为Map中的一个键值对。下面是示例代码: ```java public class ListToMap { public static void main(String[] args) { List<User> userList = new ...
在这个例子中,`Map`的键是数组元素,值是一个数组,包含所有出现相同元素的索引。如果某个元素的索引数组长度大于1,那么它就是重复元素。 以上就是在JavaScript中查找数组中重复元素的几种常见方法。在实际应用中...