- 浏览: 602732 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (199)
- 纯java (22)
- 中间件 (1)
- java线程 (1)
- webwork (10)
- HTML/CSS (11)
- struts2 (10)
- mysql (14)
- Linux (8)
- 字符编码和转换 (1)
- WebService (1)
- web (21)
- javascript (33)
- ajax (5)
- 随便写写 (3)
- svn (0)
- eclipse使用技巧 (10)
- Ant (1)
- 互联网发展方向 (1)
- Jquery (12)
- 视频 (2)
- MD5 (1)
- 项目经验总结 (1)
- Oracle (2)
- Netbeans (1)
- Apache/Tomcat (4)
- springside (1)
- hibernate (6)
- SpringSecurity (0)
- java与文件 (1)
- CKEditor (4)
- JSON (3)
- 笔试题 (0)
- 应用部署 (1)
- 杂七杂八 (1)
- android (1)
- jQuery UI (1)
- XML相关技术 (1)
- HTML5 (1)
- CSS3 (0)
- 正则表达式 (1)
- http协议 (3)
- 算法 (5)
- 互联网知识 (1)
最新评论
-
hp321:
我现在遇到一个开发自定义按钮的问题,想请教下你:问题如下:举例 ...
Ckeditor 如何在源码模式下添加可以显现的按钮 -
make1828:
javascript跨域解决方案(一) -
huxianwen:
问题是, ckeditor编辑器在源码模式并不能插入任何代码呀 ...
Ckeditor 如何在源码模式下添加可以显现的按钮 -
nidonglin1986:
虽然解决了问题,但是原因说的不是很明白啊。中文跟HTML标志 ...
struts2的标签在JS中的使用 中文乱码 -
ldw1986hf123:
[*]
JVM工作原理
第一种:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
效率高,以后一定要使用此种方式!
第二种:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}
效率低,以后尽量少使用!
例:
HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例:
public class HashMapTest {
public static void main(String[] args) ...{
HashMap hashmap = new HashMap();
for (int i = 0; i < 1000; i ) ...{
hashmap.put("" i, "thanks");
}
long bs = Calendar.getInstance().getTimeInMillis();
Iterator iterator = hashmap.keySet().iterator();
while (iterator.hasNext()) ...{
System.out.print(hashmap.get(iterator.next()));
}
System.out.println();
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
listHashMap();
}
public static void listHashMap() ...{
java.util.HashMap hashmap = new java.util.HashMap();
for (int i = 0; i < 1000; i ) ...{
hashmap.put("" i, "thanks");
}
long bs = Calendar.getInstance().getTimeInMillis();
java.util.Iterator it = hashmap.entrySet().iterator();
while (it.hasNext()) ...{
java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
// entry.getKey() 返回与此项对应的键
// entry.getValue() 返回与此项对应的值
System.out.print(entry.getValue());
}
System.out.println();
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
}
}
对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了。
到底keyset快还是entryset快,这个例子输出太多影响效果,改一下例子。
- public class HashMapTest {
- private static int MAXKEY = 1234567;
- public static void main(String[] args) {
- HashMap hashmap = new HashMap();
- for (int i = 0; i < HashMapTest.MAXKEY; i++) {
- hashmap.put(i, "thanks");
- }
- long bs = Calendar.getInstance().getTimeInMillis();
- Iterator iterator = hashmap.keySet().iterator();
- while (iterator.hasNext()) {
- Object key = iterator.next();
- Object value = hashmap.get(key);
- }
- System.out.print(Calendar.getInstance().getTimeInMillis() - bs + ",");
- listHashMap();
- }
- public static void listHashMap() {
- HashMap hashmap = new java.util.HashMap();
- for (int i = 0; i < HashMapTest.MAXKEY; i++) {
- hashmap.put(i, "thanks");
- }
- long bs = Calendar.getInstance().getTimeInMillis();
- Iterator it = hashmap.entrySet().iterator();
- Map.Entry entry;
- while (it.hasNext()) {
- entry = (java.util.Map.Entry) it.next();
- Object key = entry.getKey();
- Object value = entry.getValue();
- //Object value = hashmap.get(key);
- }
- System.out.print(Calendar.getInstance().getTimeInMillis() - bs);
- }
- }
public class HashMapTest { private static int MAXKEY = 1234567; public static void main(String[] args {
/*
* 先来测测,i为1234567时,输出 63,47 47,47 63,47 测了三次
* 改一下代码,listHashMap方法的while循环中,Object value = hashmap.get(key)
* 再测,63,79 47,78 63,79 三次
*/
keySet比entrySet慢吗?
keySet第一次遍历获得所有key,entrySet第一次遍历获得所有key和value,这一步显然entrySet会慢,看下一步。
iterator之后,keySet的next()是key,entrySet的next()是Map.Entry(包含了key和value)。
改变代码之后的测试表明,entrySet的getValue()比Map的get()确实快(虽然不知道它们内部是怎样的原理实现,虽然有人说Map的get()消耗很小)。当然,没有理由使用更改后的代码,别误导了。
于是,我想entrySet()貌似是快一些,把第一次遍历的获得同时得到key和value多花的时间抢回来了。
不过要按key排序的话,似乎keySet更方便一些。
- Object[] key_arr = hashmap.keySet().toArray();
- Arrays.sort(key_arr);
- for (Object key : key_arr) {
- Object value = hashmap.get(key);
- }
发表评论
-
什么是线程安全
2011-11-28 17:57 1133什么是线程安全? ... -
java中的hashcode
2011-11-28 11:03 958Java中有两类集合(Collection),一类是List, ... -
插入排序算法
2011-11-15 16:35 1101插入排序 Insertion Sort ... -
任意10进制的数,然后打印其2进制形式的时候里面包含多少个1
2011-11-15 15:36 1232具体做法有两种: 方法一: public class A{ ... -
交换两个数不使用第三方变量
2011-11-15 14:04 1533题目很简单:------------------------- ... -
Java 冒泡排序
2011-11-15 11:05 1179冒泡的思想精髓就是数组中相临的两个数依次相比较,如果左边的数小 ... -
Java运行时异常与普通异常的区别
2011-11-09 11:22 1651Throwable是所有Java程序中错误处理的父类,有两种资 ... -
Servlet生命周期与工作原理
2011-11-09 09:13 1113Servlet生命周期分为三个阶段: 1,初始化阶段 ... -
java 单例模式的好处
2011-11-08 17:59 1386java 单例模式的好处 ... -
JAVA工厂模式
2011-11-08 17:29 11021. 简单工厂模式 publci clas ... -
sleep和wait的区别
2011-11-14 16:45 11841、这两个方法来自不同的类分别是,sleep来自Thread类 ... -
String、StringBuffer与StringBuilder之间区别
2011-11-04 21:10 918最近学习到StringBuffer,心中有好些疑问,搜索了一些 ... -
HashMap和Hashtable的区别
2011-10-14 17:53 15181 HashMap不是线程安全的 ... -
什么是@SuppressWarnings("unchecked")
2010-10-15 10:29 1433@SuppressWarnings 批注允许您 ... -
图片压缩程序实例
2010-08-05 10:08 1338项目中要使用到图片压缩程序,在网上找了一个稍加修改就可以使用了 ... -
java replaceall 用法
2010-06-10 17:09 2236public class TryDotRegEx { publ ... -
修改jar文件中的配置文件
2010-04-13 10:52 3393可以使用两种方法对jar文件进行修改: 1.使用winRAR ... -
重定向请求的两种方式
2009-12-31 14:20 14441.在程序中如何重定向请求呢? 答:重定向请求有两种方式:1 ... -
JVM工作原理
2009-11-30 15:49 11024Java虚拟机Java虚拟机(Ja ... -
java工程最后一个文件夹最后一个文件错误
2009-07-27 13:56 1236今天再次遇到java工程最后一个文件夹最后一个文件出错。 解 ...
相关推荐
此外,使用`Iterator`可以在遍历过程中安全地删除元素,而其他两种方式无法做到这一点。从性能上看,该方法与使用增强for循环遍历`keys`或`values`(方法二)具有相似的表现。 #### 方法四:通过键查找值遍历 这种...
通过entrySet()方法,我们可以遍历HashMap中的每个键值对(Entry)。这种方式不仅可以遍历到所有的键,还可以在单次遍历中直接获得与键相对应的值。对于需要同时处理键和值的场景,entrySet()是最为高效的方法。 **...
本文将详细探讨在Java中遍历`Map`的两种常用方法:通过`keySet()`方法和通过`entrySet()`方法。 ### 一、通过`keySet()`方法遍历`Map` #### 方法概述 `keySet()`方法返回一个包含`Map`中所有键的`Set`视图。通过...
本文将深入探讨`HashMap`的遍历方法,包括`keySet()`和`entrySet()`两种主要方式,并通过代码示例对比它们的性能差异。 #### 方法一:使用`keySet()`遍历 `keySet()`方法返回`HashMap`中的所有键的集合视图。通过...
在Java编程语言中,`HashMap`和`List`(通常指的是`ArrayList`或`LinkedList`)是两种常用的数据结构,它们各自在不同的场景下有着不同的性能优势。本工程通过`VS2013`(Visual Studio 2013,虽然它主要用于C++开发...
#### 遍历HashMap的方法 根据提供的内容,我们可以了解到遍历`HashMap`主要有两种方式:使用`keySet()`方法和使用`entrySet()`方法。 1. **使用keySet()方法** ```java Map map = new HashMap(); Iterator ...
在上述的`HashMapTest`类中,通过对比`keySet()`和`entrySet()`遍历HashMap的时间,我们可以看到`entrySet()`方法通常比`keySet()`方法更快。`keySet()`需要两次遍历:一次是转换为迭代器,另一次是从HashMap中根据...
6. **遍历HashMap**:有两种方式遍历HashMap,一是通过`entrySet()`获取键值对的迭代器,二是通过`keySet()`获取键的迭代器再获取对应的值。 ```java for (Map.Entry, String> entry : map.entrySet()) { System....
6. **迭代性能**:由于HashMap使用链表解决哈希碰撞,如果某个哈希桶内的链表过长(例如,出现大量键的哈希码冲突),那么在遍历HashMap时,性能会下降到接近于O(n),其中n是链表的长度。 7. **键的唯一性**:...
总结来说,HashMap 提供了快速的键值对存储和查找,但在遍历操作中需要注意效率。选择数据结构时,应考虑是否需要线程安全、是否频繁插入/删除、以及访问模式等因素。在多线程环境下,若需保证线程安全,可以考虑...
2. collisions处理:当两个不同的Key发生哈希碰撞时,HashMap会将它们存储在同一个链表中,在查找时,HashMap会遍历链表,找到符合条件的Entry对象。 HashMap的查询效率非常高,因为它可以通过哈希函数直接定位到...
Java HashMap两种简便排序方法解析 Java HashMap是一种常用的数据结构,然而,它的储存是没有顺序的,按照key的HashCode实现。这使得在 certainsituations下的排序变得非常重要。下面,我们将介绍两种简便的排序...
2. **开放寻址法与链地址法**:解决哈希冲突的方法主要有两种。开放寻址法是当冲突发生时,寻找下一个空的哈希槽,直到找到为止;链地址法则是每个哈希桶维护一个链表,冲突的键会被添加到同一个桶的链表中。...
- 不保证顺序:插入元素的顺序不一定会反映在迭代遍历HashMap时的顺序,除非特别设计的哈希函数。 2. **使用HashMap:** - **创建HashMap:** Delphi中,你可以使用TDictionary类来创建一个HashMap实例,例如 `...
所有的复杂数据结构都可以基于这两种基本结构构建出来,HashMap也不例外。 **1.1 数组和链表结合** HashMap内部采用数组加链表(或红黑树)的形式存储数据,这种结构称为“链表散列”。数组作为主存储结构,而链表...
遍历HashMap时,可以使用`keySet()`、`values()`或`entrySet()`方法获取相应的Set视图,再进行迭代。 在面试中,除了基本的遍历方式,还可能考察一些高级话题,如并发遍历(ConcurrentModificationException)、...
本文将详细介绍几种常见的`Map`遍历方法,并解释每种方法的特点和适用场景。 #### 二、Map遍历方法概述 `Map`提供了多种遍历其内部元素的方式。其中,最常用的是通过`keySet()`、`entrySet()`以及`values()`等方法...
它不提供直接的key访问,因此在大多数情况下不如前两种方法实用。 ```java for (String v : map.values()) { System.out.println("value= " + v); } ``` 对于大容量的Map,推荐使用第三种方式,即通过Map....
在多线程环境下,两个线程同时触发扩容可能导致循环链表的形成,从而引发死循环,这是一种严重的性能问题。 为了解决HashMap的线程不安全问题,我们可以采取以下几种策略: 1. 使用Collections.synchronizedMap()...