HashMap的两种遍历方法EntrySet或者KeySet性能分析

首先列举几种HashMap的遍历方法
1.迭代器entrySet

    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();
  }

2.迭代器keySet

  Map map = new HashMap();
  Iterator iter = map.keySet().iterator();
  while (iter.hasNext()) {
	  Object key = iter.next();
	  Object val = map.get(key);
  }

3.for循环entrySet

	Map<String, String> map = new HashMap<String, String>();
	for (Entry<String, String> entry : map.entrySet()) {
		entry.getKey();
		entry.getValue();
	}

4.for选好keySet

	Map<String, String> map = new HashMap<String, String>();
	for (String key : map.keySet()) {
		map.get(key);
	}

       这样写是想凸显出遍历过程中entrySet和keySet的地位,以便后面分析不同的遍历方法之间性能差异。从上面的例子我们发现无论是for循环还是迭代器遍历,时间复杂度都是o(n).换句话说具体使用for循环还是迭代器影响不大。具体的时间复杂度与使用的是keySet还是entrySet以及我们使用的是key还是value有关。
从代码上看entrySet的执行步骤可以分为,取entrySet,取entry,取key或者Value,keySet的执行步骤可以分为取keySet,取key,取value。这样对比就不难发现如果我们只是使用key,那么keySet做遍历,执行的步骤更少;如果取value,那么entrySet的执行步骤更少。
实际上keySet取value的需要通过Map的get方法获取value,要先计算key的hash值,然后再通过hash值取value,这个我们可以通过HashMap的源码看出来。

/**
 * Gets the value mapped to the key specified.
 * 
 * @param key  the key
 * @return the mapped value, null if no match
 */
public Object get(Object key) {
	purgeBeforeRead();
	Entry entry = getEntry(key);
	if (entry == null) {
		return null;
	}
	return entry.getValue();
}
/**
 * Gets the entry mapped to the key specified.
 * <p>
 * This method exists for subclasses that may need to perform a multi-step
 * process accessing the entry. The public methods in this class don't use this
 * method to gain a small performance boost.
 * 
 * @param key  the key
 * @return the entry, null if no match
 */
protected HashEntry getEntry(Object key) {
	key = convertKey(key);
	int hashCode = hash(key);
	HashEntry entry = data[hashIndex(hashCode, data.length)]; // no local for hash index
	while (entry != null) {
		if (entry.hashCode == hashCode && isEqualKey(key, entry.key)) {
			return entry;
		}
		entry = entry.next;
	}
	return null;
}

总结一下:凡是之间问性能优劣的都是耍流氓,凡是之间回答性能优劣的都是耍臭流氓。除了很明显的差异外,性能无疑不与使用场景密切相关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap的几种遍历方式如下: 1. Entry遍历:使用entrySet()方法可以同时遍历Map里面的Key和Value。可以通过迭代器或者foreach循环来实现。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用entrySet()方法遍历 for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); // 处理key和value } ``` 2. keySet遍历:使用keySet()方法可以遍历Map里面的Key。可以通过迭代器或者foreach循环来实现。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用keySet()方法遍历 for (String key : map.keySet()) { Integer value = map.get(key); // 处理key和value } ``` 3. foreach遍历:在JDK8及以上版本中,可以直接使用foreach循环来遍历HashMap的键值对。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用foreach遍历 map.forEach((key, value) -> { // 处理key和value }); ``` 4. keySet foreach遍历:在JDK8及以上版本中,可以使用keySet()方法获取键的集合,然后使用foreach循环遍历。例如: ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用keySet foreach遍历 for (String key : map.keySet()) { Integer value = map.get(key); // 处理key和value } ``` 以上是HashMap的几种常见遍历方式。根据具体的需求,可以选择适合的遍历方式来操作HashMap的键值对。 #### 引用[.reference_title] - *1* *3* [Java - 关于HashMap通过keySet遍历kv的二次调用问题](https://blog.csdn.net/Zong_0915/article/details/120905738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [HashMap的七种遍历方式](https://blog.csdn.net/maojian_ohhey/article/details/115431835)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值