Map中的hashMap遍历的三种方法

package com.rmq.Map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
*
*

  • 项目名称:集合
  • 类名称:MapDemo
  • 类描述:
  • @version
  • Map接口
  • 1.键值对储存一组对象
  • 2.Key不能重复 Value可以重复
  • 3.具体的实现类:HashMap TreeMap Hashtable linkedHashMap

*/

public class MapDemo {
public static void main(String[] args) {
hashMap();

}

private static void hashMap() {
	Map<Integer, String> map = new HashMap<>();
	map.put(1, "Tom");
	map.put(9, "T");
	map.put(3, "Jerry");
	map.put(4, "J");
	
	System.out.println("size"+map.size());
	//从Map中取值
	map.get(1);
	//从Map中取值,通过key取value
	System.out.println(map.get(1));
	//1.第一种遍历方法  遍历Entry
	Set<Entry<Integer, String>> entrySet = map.entrySet();
	for(Entry en: entrySet) {
		System.out.println(en.getKey()+"->"+en.getValue());
	}
	System.out.println();
	//2.第二种遍历方法
	Set<Integer> keys = map.keySet();
	for(Integer i: keys) {
		String value = map.get(i);
		System.out.println(i+"->"+value);
	}
	//3.第三种迭代方法  遍历值
	Collection<String> values = map.values();
	for(String value: values) {
		
		System.out.println(values);
	}
}

}

Map中的hashMap遍历的三种方法

下面是我从别的博主那里复制过来的有助于大家更好的理解
博主大佬介意的话,请给我发信息,我会马上改过来的

HashMap可以接受null键值和值,而HashTable则不能,HashMap是非synchronized的;存储的是键值对。

  1. HashMap是基于hashing原理,使用put(key,value)存储对象到HashMap中,使用get(key)从HashMap中获取对象,当我们给put方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来存储键对象和值对象,作为Map.Entry.

  2. 如果两个对象hashCode相同:

存储时:他们会找到相同的bucket位置,发生碰撞,因为HashMap使用链表存储对象(每个Map.Entry都有一个next指针),这个Entry会存储在链表中。

获取时:会用hashCode找到bucket位置,然后调用key.equals()方法找到链表中正确的节点.最终找到要找的值对象.

减少碰撞:使用final修饰的对象、或不可变的对象作为键,使用(Integer、String)(是不可变、final的,而且已经重写了equals和hashCode方法)这样的wrapper类作为键是非常好的,(我们可以使用自定义的对象作为键吗?答:当然可以,只要它遵守了equals和hashCode方法定义规则,并且当对象插入到Map中之后将不会再改变。)

  1. HashMap负载因子默认是0.75,可设置,当map填满了75%的bucket时候,将会创建原来HashMap大小两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中,这个过程叫做rehashing,因为它调用hash方法找到新的bucket位置。

  2. 重新调整map大小可能会发生竞争问题:如果两个线程都发现HashMap需要调整大小了,它们都会尝试进行调整,在调整中,存储在链表中的元素的次序会反过来,因为移动bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历,如果条件竞争发生了,就死循环了。


作者:byds520
来源:****
原文:https://blog.****.net/lovewebeye/article/details/79573702
版权声明:本文为博主原创文章,转载请附上博文链接!