在开发中经常会遇到对Map中的key和value值对的遍历操作,一般有如下两种方法:
方法一:
Set keySet = map.keySet();
for(Iterator it = keySet.iterator();it.hasNext();){
Object key = it.next();
Object value = map.get(key);
}
方法二:
Set entrySet = map.entrySet();
for(Iterator it = entrySet.iterator();it.hasNext();){
Entry entry = (Entry)it.next();
Object key = entry.getKey();
Object value = entry.getValue();
}
写一个简单的测试就会发现,方法二比方法一的效率高了接近1倍。
分析如下:
方法一的
Set keySet = map.keySet();
是先从Map中获取keySet,代码如下:
public Set keySet() {
Set ks = keySet;
return (ks != null ? ks : (keySet = new KeySet()));
}
private class KeySet extends AbstractSet {
public Iterator iterator() {
return newKeyIterator();
}
public int size() {
return size;
}
public boolean contains(Object o) {
return containsKey(o);
}
public boolean remove(Object o) {
return HashMap.this.removeEntryForKey(o) != null;
}
public void clear() {
HashMap.this.clear();
}
}
返回一个私有类KeySet, 它是从AbstractSet继承而来,实现了Set接口。
方法二的
Set entrySet = map.entrySet();
实现与keySet基本相同,可以认为效率是一样的,但是方法一还有一个
map.get(key);
这个方法是这样的:
public V get(Object key) {
Object k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length); //Entry[] table
Entry e = table;
while (true) {
if (e == null)
return null;
if (e.hash == hash && eq(k, e.key))
return e.value;
e = e.next;
}
}
其实就是再次利用Hash值取出相应的Entry做比较得到结果,所以方法一两次进入HashMap的Entry中,
而方法二取得Entry的值之后直接取key和value,效率比方法一高。
其实看Map的概念,本来就是key和value的键值对,将key和value分开操作在这种场景下显然不是个好选择。
分享到:
相关推荐
遍历Map通常有两种方式:一种是遍历keySet,另一种是遍历entrySet。 ```java Map, Integer> map = new HashMap(); map.put("one", 1); map.put("two", 2); // 遍历keySet for (String key : map.keySet()) { ...
在实际开发中,熟练运用集合框架可以极大地提高代码的可读性和效率。例如,使用List的subList()方法创建子列表,或者利用Map的getOrDefault()方法快速获取键对应的值。此外,通过了解不同集合实现的性能特点,可以...
通过分析和实践这些源码,开发者可以深入理解如何在不同场景下选择合适的数据结构,提高程序的效率和可维护性。同时,对于初学者来说,这些示例提供了直观的学习途径,帮助他们将理论知识转化为实际编程能力。因此,...
在前端开发中,有些巧妙的解决方案可以提高效率或解决特定问题,例如: 1. CSS Hack:应对不同浏览器的兼容性问题,如条件注释、负margin、vendor前缀等。 2. JavaScript优化:利用函数节流、防抖动减少性能消耗,...
本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ConcurrentHashMap。 HashMap 众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk...
通过学习和实践这些数据结构和算法,可以提高编程能力,优化代码效率,更好地解决复杂问题。《数据结构与算法分析》这样的教材通常会提供课后习题和答案,帮助读者巩固理解。在阅读和解答这些习题时,应深入思考每个...
这两个库提供了一套丰富的实用函数,例如`_.map`用于遍历数组,`_.reduce`用于聚合数据,`_.find`用于查找数组中的特定元素,`_.merge`用于合并对象等。然而,随着JavaScript的不断进化,很多这些功能已经在原生语言...
首先,我们来谈谈容器。STL提供了多种容器,如vector、list、deque、set、map等,它们用来存储和管理数据。例如,vector是一种动态数组,可以在其尾部快速添加或删除元素;list是由双向链表组成的,支持在任意位置...
首先,我们来谈谈**迭代器解析**。这种方式适用于当你需要逐个遍历JSON数据中的键值对时。在Java中,你可以使用`org.json`库中的`JSONObject`类。假设我们有一个JSON字符串,我们可以通过创建一个`JSONObject`实例,...
11. 问题:谈谈你对Java多线程同步的理解,以及synchronized关键字的作用? 答案:Java多线程同步是为了避免多个线程访问共享资源时可能产生的数据不一致问题。synchronized关键字是Java提供的一个内置锁机制,它...
数据结构是组织和存储数据的方式,它决定了数据的访问和操作效率。常见的数据结构有数组、链表、栈、队列、树(如二叉树、AVL树、红黑树等)、图以及哈希表等。这些数据结构在不同的场景下各有优势,比如数组提供...
首先,异常处理是Java中不可或缺的一部分,它提供了一种优雅的方式来处理程序运行时可能遇到的问题。Java使用try-catch-finally语句块来捕获和处理异常。当一个异常发生时,程序会立即跳转到相应的catch块,这样可以...
在处理大规模数据时,`map()`可以实现并行计算,提高效率。 `filter()`函数根据提供的函数对可迭代对象的元素进行筛选,返回符合条件的元素构成的迭代器。在数据分析中,`filter()`常用于筛选满足特定条件的数据。 ...
Java集合框架是Java编程语言中...以上只是Java集合框架面试题的一部分,实际面试中还可能涉及更深入的问题,如集合的容量、负载因子、遍历性能优化等。理解并熟练掌握这些知识点对于成为一名优秀的Java开发者至关重要。
4. **树与图**:理解和实现树的遍历(如前序、中序、后序),以及图的遍历(如深度优先搜索、广度优先搜索),并解决路径查找、最短路径等问题。 5. **哈希表**:使用哈希表进行快速查找,解决查找冲突问题,以及...
STL是C++编程中的核心组件,它提供了高效的数据结构和算法,极大地提高了代码的可复用性和效率。这本书通过详细讲解STL的各个部分,包括容器、迭代器、算法和函数对象,让开发者能够深入理解并熟练应用STL。 首先,...
可以使用`ResultSet`遍历查询结果: ```java String sql = "SELECT * FROM table_name WHERE condition"; PreparedStatement pstmt = connection.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); ...
首先,我们来谈谈“数据结构”。数据结构是计算机科学中的核心概念,它研究如何在计算机中组织和存储数据,以便更有效地进行访问和修改。常见的数据结构有数组、链表、栈、队列、树、图等。通过学习数据结构,开发者...
理解数组的创建、初始化、遍历以及如何处理数组越界等问题,是Java基础学习的重要部分。 面向对象编程是Java的核心特性之一。OOPs主要包括封装、继承、多态和抽象四大原则。封装允许我们将数据和操作数据的方法捆绑...
首先,我们来谈谈模板。模板是C++中的一个关键特性,允许我们定义通用函数和类。它可以用于创建泛型代码,这意味着相同的函数或类可以处理不同类型的参数。例如,模板函数`template<typename T> T max(T a, T b)`可...