密码箱忘记密码了咋整怎么打开

  对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为 其比keySet的效率高很多。理由是:entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个 key,都要去Map中额外查找一次value,从而降低了总体效率。那么实际情况如何呢?
  为了解遍历性能的真实差距,包括在遍历key+value、遍历key、遍历value等不同场景下的差异,我试着进行了一些对比测试。
2. 对比测试
  一开始只进行了简单的测试,但结果却表明keySet的性能更好,这一点让我很是费解,不都说entrySet明显好于keySet吗?为了进一步地进行验证,于是采用了不同的测试数据进行更详细的对比测试。
2.1 测试数据
2.1.1 HashMap测试数据
HashMap-1,大小为100万,key和value均为String,key的值为1、2、3&&1000000:
Map&String, String& map = new HashMap&String, String&();
String key,
for (i = 1; i &= i++) {
&&& key = "" +
&&& value = "value";
&&& map.put(key, value);
HashMap-2,大小为100万,key和value均为String,key的值为50、100、150、200、&&、:
Map&String, String& map = new HashMap&String, String&();
String key,
for (i = 1; i &= i++) {
&&& key = "" + (i * 50);
&&& value = "value";
&&& map.put(key, value);
2.1.2 TreeMap测试数据
TreeMap-1,大小为100万,key和value均为String,key的值为1、2、3&&1000000:
Map&String, String& map = new TreeMap&String, String&();
String key,
for (i = 1; i &= i++) {
&&& key = "" +
&&& value = "value";
&&& map.put(key, value);
TreeMap-2,大小为100万,key和value均为String,key的值为50、100、150、200、&&、,更离散:
Map&String, String& map = new TreeMap&String, String&();
String key,
for (i = 1; i &= i++) {
&&& key = "" + (i * 50);
&&& value = "value";
&&& map.put(key, value);
2.2 测试场景
  分别使用keySet、entrySet和values的多种写法测试三种场景:遍历key+value、遍历key、遍历value的场景。
2.2.1 遍历key+value
keySet遍历key+value(写法1):
Iterator&String& iter = map.keySet().iterator();
while (iter.hasNext()) {
&&& key = iter.next();
&&& value = map.get(key);
keySet遍历key+value(写法2):
for (String key : map.keySet()) {
&&& value = map.get(key);
entrySet遍历key+value(写法1):
Iterator&Entry&String, String&& iter = map.entrySet().iterator();
Entry&String, String&
while (iter.hasNext()) {
&&& entry = iter.next();
&&& key = entry.getKey();
&&& value = entry.getValue();
&entrySet遍历key+value(写法2):
for (Entry&String, String& entry: map.entrySet()) {
&&& key = entry.getKey();
&&& value = entry.getValue();
2.2.2 遍历key
keySet遍历key(写法1):
Iterator&String& iter = map.keySet().iterator();
while (iter.hasNext()) {
&&& key = iter.next();
keySet遍历key(写法2):
for (String key : map.keySet()) {
&entrySet遍历key(写法1):
Iterator&Entry&String, String&& iter = map.entrySet().iterator();
while (iter.hasNext()) {
&&& key = iter.next().getKey();
entrySet遍历key(写法2):
for (Entry&String, String& entry: map.entrySet()) {
&&& key = entry.getKey();
2.2.3 遍历value
keySet遍历value(写法1):
Iterator&String& iter = map.keySet().iterator();
while (iter.hasNext()) {
&&& value = map.get(iter.next());
keySet遍历value(写法2):
for (String key : map.keySet()) {
&&& value = map.get(key);
entrySet遍历value(写法1):
Iterator&Entry&String, String&& iter = map.entrySet().iterator();
while (iter.hasNext()) {
value = iter.next().getValue();
entrySet遍历value(写法2):
for (Entry&String, String& entry: map.entrySet()) {
&&& value = entry.getValue();
values遍历value(写法1):
Iterator&String& iter = map.values().iterator();
while (iter.hasNext()) {
value = iter.next();
values遍历value(写法2):
for (String value : map.values()) {
2.3 测试结果
2.3.1 HashMap测试结果
单位:毫秒
keySet遍历key+value(写法1)
keySet遍历key+value(写法2)
entrySet遍历key+value(写法1)
entrySet遍历key+value(写法2)
单位:毫秒
keySet遍历key(写法1)
keySet遍历key(写法2)
entrySet遍历key(写法1)
entrySet遍历key(写法2)
单位:毫秒
keySet遍历value(写法1)
keySet遍历value(写法2)
entrySet遍历value(写法1)
entrySet遍历value(写法2)
values遍历value(写法1)
values遍历value(写法2)
2.3.2 TreeMap测试结果
单位:毫秒
keySet遍历key+value(写法1)
keySet遍历key+value(写法2)
entrySet遍历key+value(写法1)
entrySet遍历key+value(写法2)
单位:毫秒
keySet遍历key(写法1)
keySet遍历key(写法2)
entrySet遍历key(写法1)
entrySet遍历key(写法2)
单位:毫秒
keySet遍历value(写法1)
keySet遍历value(写法2)
entrySet遍历value(写法1)
entrySet遍历value(写法2)
values遍历value(写法1)
values遍历value(写法2)
3.1 如果你使用HashMap
同时遍历key和value时,keySet与entrySet方法的性能差异 取决于key的具体情况,如复杂度(复杂对象)、离散度、冲突率等。换言之,取决于HashMap查找value的开销。entrySet一次性取出所有 key和value的操作是有性能开销的,当这个损失小于HashMap查找value的开销时,entrySet的性能优势就会体现出来。例如上述对比 测试中,当key是最简单的数值字符串时,keySet可能反而会更高效,耗时比entrySet少10%。总体来说还是推荐使用entrySet。因为 当key很简单时,其性能或许会略低于keySet,但却是可控的;而随着key的复杂化,entrySet的优势将会明显体现出来。当然,我们可以根据 实际情况进行选择
只遍历key时,keySet方法更为合适,因为entrySet将无用的value也给取出来了,浪费了性能和空间。在上述测试结果中,keySet比entrySet方法耗时少23%。
只遍历value时,使用vlaues方法是最佳选择,entrySet会略好于keySet方法。
在不同的遍历写法中,推荐使用如下写法,其效率略高一些:
for (String key : map.keySet()) {
&&& value = map.get(key);
for (Entry&String, String& entry: map.entrySet()) {
&&& key = entry.getKey();
&&& value = entry.getValue();
for (String value : map.values()) {
3.2 如果你使用TreeMap
同时遍历key和value时,与HashMap不同,entrySet的性能 远远高于keySet。这是由TreeMap的查询效率决定的,也就是说,TreeMap查找value的开销较大,明显高于entrySet一次性取出 所有key和value的开销。因此,遍历TreeMap时强烈推荐使用entrySet方法。
只遍历key时,keySet方法更为合适,因为entrySet将无用的value也给取出来了,浪费了性能和空间。在上述测试结果中,keySet比entrySet方法耗时少24%。
只遍历value时,使用vlaues方法是最佳选择,entrySet也明显优于keySet方法。
在不同的遍历写法中,推荐使用如下写法,其效率略高一些:
for (String key : map.keySet()) {
&&& value = map.get(key);
for (Entry&String, String& entry: map.entrySet()) {
&&& key = entry.getKey();
&&& value = entry.getValue();
for (String value : map.values()) {
阅读(...) 评论()java 遍历map 方法 集合 五种的方法 -
- ITeye技术网站
以下是转载别人的日志,以方便自己以后使用,仅供自己学习之用。
package com.jackey.
import java.util.ArrayLimport java.util.HashMimport java.util.Iimport java.util.Limport java.util.Mimport java.util.S
//循环遍历map的方法public class CircleMap { public static void main(String[] args) {
Map&String, Integer& tempMap = new HashMap&String, Integer&();
tempMap.put("a", 1);
tempMap.put("b", 2);
tempMap.put("c", 3);
// JDK1.4中
// 遍历方法一 hashmap entrySet() 遍历
System.out.println("方法一");
Iterator it = tempMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println("key=" + key + " value=" + value);
System.out.println("");
// JDK1.5中,应用新特性For-Each循环
// 遍历方法二
System.out.println("方法二");
for (Map.Entry&String, Integer& entry : tempMap.entrySet()) {
String key = entry.getKey().toString();
String value = entry.getValue().toString();
System.out.println("key=" + key + " value=" + value);
System.out.println("");
// 遍历方法三 hashmap keySet() 遍历
System.out.println("方法三");
for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println(obj);// 循环输出key
System.out.println("key=" + obj + " value=" + tempMap.get(obj));
for (Iterator i = tempMap.values().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println(obj);// 循环输出value
System.out.println("");
// 遍历方法四 treemap keySet()遍历
System.out.println("方法四");
for (Object o : tempMap.keySet()) {
System.out.println("key=" + o + " value=" + tempMap.get(o));
System.out.println("11111");
// java如何遍历Map &String, ArrayList& map = new HashMap &String,
// ArrayList&();
System.out
.println("java
遍历Map &String, ArrayList& map = new HashMap
&String, ArrayList&();");
Map&String, ArrayList& map = new HashMap&String, ArrayList&();
Set&String& keys = map.keySet();
Iterator&String& iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
ArrayList arrayList = map.get(key);
for (Object o : arrayList) {
System.out.println(o + "遍历过程");
System.out.println("2222");
Map&String, List& mapList = new HashMap&String, List&();
for (Map.Entry entry : mapList.entrySet()) {
String key = entry.getKey().toString();
List&String& values = (List) entry.getValue();
for (String value : values) {
System.out.println(key + " --& " + value);
浏览 47086
xingerheyaolong
浏览: 89148 次
来自: 长沙
研究了好几天的fusioncharts做报表统计,希望能共享一 ...
直接这样就可以了,BeanUtils.populate(bea ...
兄弟偶看好你了
兄弟,我的邮箱
真心感谢
非常感谢 我也解决问题了……呼呼
之前我不在web下测是可以 ...Java中如何遍历Map对象的4种方法
来源:易贤网&& 阅读:190 次&&日期:
温馨提示:易贤网小编为您整理了“Java中如何遍历Map对象的4种方法”,方便广大网友查阅!
在Java中如何遍历Map对象How to Iterate Over a Map in Java在java中遍历Map有不少的方法。我们看一下最常用的方法及其优缺点。既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)方法一、在for-each循环中使用entries来遍历这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。Map&Integer, Integer& map = new HashMap&Integer, Integer&();for (Map.Entry&Integer, Integer& entry : map.entrySet()) {System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}注意:for-each循环在java 5中被引入所以该方法只能应用于java 5或更高的版本中。如果你遍历的是一个空的map对象,for-each循环将抛出NullPointerException,因此在遍历前你总是应该检查空引用。方法二、在for-each循环中遍历keys或values。如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。Map&Integer, Integer& map = new HashMap&Integer, Integer&();//遍历map中的键for (Integer key : map.keySet()) {System.out.println("Key = " + key);}//遍历map中的值for (Integer value : map.values()) {System.out.println("Value = " + value);}该方法比entrySet遍历在性能上稍好(快了10%),而且代码更加干净。方法三、使用Iterator遍历使用泛型:Map&Integer, Integer& map = new HashMap&Integer, Integer&();Iterator&Map.Entry&Integer, Integer&& entries = map.entrySet().iterator();while (entries.hasNext()) {Map.Entry&Integer, Integer& entry = entries.next();System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}不使用泛型:Map map = new HashMap();Iterator entries = map.entrySet().iterator();while (entries.hasNext()) {Map.Entry entry = (Map.Entry) entries.next();Integer key = (Integer)entry.getKey();Integer value = (Integer)entry.getValue();System.out.println("Key = " + key + ", Value = " + value);}你也可以在keySet和values上应用同样的方法。该种方式看起来冗余却有其优点所在。首先,在老版本java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。根据javadoc的说明,如果在for-each遍历中尝试使用此方法,结果是不可预测的。从性能方面看,该方法类同于for-each遍历(即方法二)的性能。方法四、通过键找值遍历(效率低)Map&Integer, Integer& map = new HashMap&Integer, Integer&();for (Integer key : map.keySet()) {Integer value = map.get(key);System.out.println("Key = " + key + ", Value = " + value);}作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。因为从键取值是耗时的操作(与方法一相比,在不同的Map实现中该方法慢了20%~200%)。如果你安装了FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。总结如果仅需要键(keys)或值(values)使用方法二。如果你使用的语言版本低于java 5,或是打算在遍历时删除entries,必须使用方法三。否则使用方法一(键值都要)。
更多信息请查看
更多信息请查看
【】&&&&&【点此处查询各地各类考试咨询QQ号码及交流群】
易贤网手机网站地址:
由于各方面情况的不断调整与变化,易贤网提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
相关阅读 & & &
&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp会员注册
本站不参与评论!()
自觉遵守:爱国、守法、自律、真实、文明的原则
尊重网上道德,遵守中华人民共和国各项有关法律法规
严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的评论
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
您在本站发表的评论,本站有权保留、转载、引用或者删除
参与本评论即表明您已经阅读并接受上述条款Java开发(113)

该方法判断Map集合对象中是否包含指定的键名。如果Map集合中包含指定的键名,则返回true,否则返回false。
语法& containsKey(Object key)&
key:是要查询的Map集合的键名对象。
典型应用& 本示例首先使用HashMap类创建Map集合对象,并向集合中添加几个元素,然后调用containsKey方法查询是否包含指定的键名。运行结果如图1.22所示。
本示例的关键代码如下:
public static void main(String[] args) {
&&Map map = new HashMap();&&&&&&&//定义Map对象
&&map.put(&apple&, &新鲜的苹果&);&&&&&&//向集合中添加对象
&&map.put(&computer&, &配置优良的计算机&);
&&map.put(&book&, &堆积成山的&);
&&map.put(&time&, new Date());&
&&String key = &book&;&
&&boolean contains = map.containsKey(key);&&&&//判断是否包含指定的键值
&&if (contains) {&&&&&&&&&//如果条件为真
&&&System.out.println(&在Map集合中包含键名& + key);&//输出信息
&&} else {
&&&System.out.println(&在Map集合中不包含键名& + key);
语法& containsValue(Object value)
value:要查询的Map集合的指定键值对象。
示例& 本示例首先使用HashMap类创建Map集合对象,并向集合中添加几个元素,然后调用containsValue方法查询是否包含指定的键值对象。
public static void main(String[] args) {
&&Map map = new HashMap();&&&&&//定义Map集合对象
&&map.put(&apple&, &新鲜的苹果&);&&&&//向对象添加元素&
&&map.put(&computer&, &配置优良的计算机&);
&&map.put(&book&, &堆积成山的&);
&&map.put(&time&, new Date());&
&&&Thread.sleep(1000); &&&&&//休眠1秒,使两个Date对象不相等
&&} catch (InterruptedException e) {
&&&e.printStackTrace();
&&Date value = new Date();&&&&&//创建日期时间对象
&&boolean contains = map.containsValue(value);&//判断集合中是否包含指定的value值
&&if (contains) {&&&&&&&//如果条件成立&
&&&System.out.println(&在Map集合中包含键值& + value);&//输出信息
&&&System.out.println(&在Map集合中不包含键值& + value);
运行结果如图1.23所示。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:106735次
积分:4533
积分:4533
排名:第5191名
原创:309篇
转载:285篇
评论:11条
阅读:1196
(4)(1)(2)(1)(11)(13)(14)(24)(59)(83)(77)(67)(139)(103)(2)}

我要回帖

更多关于 密码箱打不开怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信