Map集合遍历有两种方法
第一:mapEntry方式
第二:keySet方式
HashMap 和Hashtable 的区别
- HashMap允许键和值是null,而Hashtable不允许键或者值是null。
- Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
- HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败(具体看下文)的。另一方面,Hashtable提供了对键的列举(Enumeration)。
- 一般认为Hashtable是一个遗留的类。
Map集合的第一种遍历方式【效率高】:
思路:这种方式的思想是把Map集合调用entrySet()方法整体保存到一个Set集合中,再迭代获取Entry对象,然后从Entry对象中取得key和value。效率高!!!
[java] view plain copy
- public class HashMapTest {
- public static void main(String[] args) {
- /* 创建一个map集合 */
- Map maps = new HashMap<>();
- /* 往集合中添加数据 */
- maps.put("id", "0113285");
- maps.put("name", "张三");
- maps.put("sex", "男");
- /*出现两个相同的key,编译是不会报错的。但是不能保存到集合中*/
- maps.put("id", "0113285");
- /*key和value都可以是null值*/
- maps.put(null, "hello");
- System.out.println(maps.size());
- /* 把maps集合存储到一个Set结合中,然后再调用iterator()方法,获取一个遍历的迭代器 */
- Iterator it = maps.entrySet().iterator();
- /* 遍历 */
- while (it.hasNext()) {
- /* 从迭代器中获取一个entry对象 */
- Entry entry = (Entry) it.next();
- /* 通过entry.getKey()的方法获取key值 */
- System.out.println("key:" + entry.getKey());
- /* 通过entry.getValue()的方法获取value值 */
- System.out.println("value:" + entry.getValue());
- }
- }
- }
注:
1:Map集合中key和value都可以是null值!
2:出现两个相同的key值,编译是不会报错的,但是只能保存一个对象到集合中!
第二种遍历方式【效率低】:
思路:这种方式的思想是把map集合的key存到一个Set集合中,再遍历key,然后通过key去获取对应的value值。效率比较低!!!
[java] view plain copy
- public class HashMapTest {
- public static void main(String[] args) {
- /* 创建一个map集合 */
- Map maps = new HashMap<>();
- /* 往集合中添加数据 */
- maps.put("id", "0113285");
- maps.put("name", "张三");
- maps.put("sex", "男");
- maps.put(null, "hello");
- /* 把map集合中的Key存储到一个Set集合中,然后调用itera()方法获取一个迭代器 */
- Iterator it = maps.keySet().iterator();
- /* 遍历key,通过key的值获取value */
- while (it.hasNext()) {
- /* 获取key */
- Object key = it.next();
- System.out.println("key:" + key);
- /* 通过key值获取value值 */
- Object value = maps.get(key);
- System.out.println("value" + value);
- }
- }
- }
上面老说entrySet的方式比keySet的方式效率高,真的吗?我么可以通过一个程序来测试一下:
[java] view plain copy
- public class HashMapTest {
- public static void main(String[] args) {
- /*获取程序开始的时间*/
- long startTime = System.currentTimeMillis();
- /* 创建一个map集合 */
- Map maps = new HashMap<>();
- /*循环往集合中添加数据*/
- for (int i =0; i<8000000; i++){
- maps.put(i, "张三"+i);
- }
- /*调用第一种方式,测试运行时间*/
- iteratorByEntrySet(maps);
- /*调用第二种方式,测试运行时间*/
- //iteratorByKeySet(maps);
- /*获取程序借宿需要的时间*/
- long endTime = System.currentTimeMillis();
- System.out.println("通过EntrySet遍历的效率:" + (endTime - startTime));
- //System.out.println("通过keySet遍历的效率:" + (endTime - startTime));
- }
- /**
- * 通过keySet方式遍历Map集合
- * @param map
- */
- public static void iteratorByKeySet(Map map){
- /* 把map集合中的Key存储到一个Set集合中,然后调用itera()方法获取一个迭代器 */
- Iterator it = map.keySet().iterator();
- /* 遍历key,通过key的值获取value */
- while (it.hasNext()){
- /* 获取key */
- Object key = it.next();
- Object value = map.get(key);
- }
- }
- /**
- * 通过entrySet方式遍历Map集合
- * @param map
- */
- public static void iteratorByEntrySet(Map map){
- /* 把maps集合存储到一个Set结合中,然后再调用iterator()方法,获取一个遍历的迭代器 */
- Iterator it = map.entrySet().iterator();
- while (it.hasNext()){
- /*获取Entry对象*/
- Entry entry = (Entry) it.next();
- /*从entry对象中直接获取key和value*/
- Object key = entry.getKey();
- Object value = entry.getValue();
- }
- }
- }
运行程序我们可以发现:
entrySet遍历的时间为:15100ms
keySet遍历的时间为:24084ms
所以:entrySet的效率高于keySet !!!!