HashMap的几种遍历方式
1、Map的简单介绍
Map是双列集合顶级父接口,主要实现类有HashMap、TreeMap、HashTable、LinkedHashMap。
- HashMap
首先HashMap是线程不安全的,根据key的HashCode值来存储数据,根据key可以直接获取它的value,HashMap最多只允许一条记录的key值为null。允许多提条记录的值为null。当put相同的key值时,数据会覆盖 - TreeMap
能够把它保存的记录根据key排序也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null;线程不安全。 - HashTable
key和value都不可以是null;支持线程的同步,写入比较慢。 - LinkedHashMap
保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,线程不安全。
2、HashMap的排序
- keySet方法,通过 map1.keySet() 获取key 通过key得到value(keySet()遍历是先将keys存入Set集合,再遍历该集合中的keys,再用 遍历得到的key取得相应的值)如果说把丈夫作为主键,keySet就相当于拿到所有的丈夫,再根据丈夫去看他的妻子是谁。
public void test5() throws Exception{
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("数学", 20);
map.put("英语", 18);
map.put("语文", 17);
map.put("历史", 25);
//这里key值相同时间,意味着修改value的值,并不会出现两个历史
map.put("历史", 30);
//通过 map1.keySet() 获取key 通过key得到value
for (String key : map.keySet()) {
Integer value = map.get(key);
System.out.println("key : "+key+" value : "+value);
}
}
- entrySet方法,(entrySet()是把所有的键值对存入Set集合。一对一对的存的。得到所有的键值对,直接遍历该集合得到单个的键值对Map.Entry的对象。再用键值对这种类的方法getKey()和getValue()得到相应的键与值)entrySet相当于是拿到所有的结婚证,根据结婚证直接看丈夫和妻子的关系。
public void test6() throws Exception{
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("数学", 20);
map.put("英语", 18);
map.put("语文", 17);
map.put("历史", 25);
//这里key值相同时间,意味着修改value的值,并不会出现两个历史
map.put("历史", 30);
for (Map.Entry<String, Integer> entry : map.entrySet()){
System.out.println("key : "+entry.getKey()+" value : "+entry.getValue());
}
}
- 只遍历值,这种方式只能获取到值,获取不到key
public void test7() throws Exception{
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("数学", 20);
map.put("英语", 18);
map.put("语文", 17);
map.put("历史", 25);
//这里key值相同时间,意味着修改value的值,并不会出现两个历史
map.put("历史", 30);
for (Integer value : map.values()){
System.out.println("value : "+value);
}
}