目录
有关于 map.entrySet() 和 keySet():
HashMap (散列表)
HashMap基于哈希表的Map接口实现, 是一个散列表 存储的是 key-value 键值对 * 根据hashCode 值存储数据,允许使用null 和null 键除了非同步和允许使用null 其他大致与Hashtable 相同。此类不保证映射顺序,不保证顺序不变。
具有很快地访问速度最多允许一条记录为null 不支持线程同步。
什么会影响HashMap的性能:
HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
同步操作:
对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap
方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:
Map m = Collections.synchronizedMap(new HashMap(...));
HashMap 三种遍历
/** HashMap 是一个散列表 存储的是 key-value 键值对 * 根据hashCode 值存储数据,具有很快地访问速度最多允许一条记录为null 不支持线程同步。 * Created by zengjx on 2019/5/7. */
package collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
HashMap 三种遍历
public class CllectionDemo {
public static void main(String[] args ){
hashMapDemo();
}
public static void hashMapDemo(){
Map<String ,String > map =new HashMap<String,String>();
map.put("1","AAAAA");
map.put("2","BBBBBB");
map.put("3","CCCCC");
//方法1 通过 map .keySet 遍历 map.get(key) 取值。
for(String key :map.keySet()){
System.out.println(map.get(key));
}
// 方法2 通过Map.entrySet 使用 iterator 遍历 key value
Iterator<Map.Entry<String,String >> iter =map.entrySet().iterator();
while(iter.hasNext()){
System.out.println(" --"+iter.next());
}
//方法3 通过 Map.Entry entrySet () entry.geyKey()
for(Map.Entry<String,String> entry:map.entrySet()){
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}
有关于 map.entrySet() 和 keySet():
1、如果遍历 hashMap() 时 entry
Set() 方法是将 key 和 value 全部取出来,所以性能开销是可以预计的, 而 keySet() 方法进行遍历的时候是根据取出的 key 值去查询对应的 value 值, 所以如果 key 值是比较简单的结构(如 1,2,3...)的话性能消耗上是比 entrySet() 方法低, 但随着 key 值得复杂度提高 entrySet() 的优势就会显露出来。
2、综合比较在只遍历 key 的时候使用 keySet(), 在只遍历 value 的是使用 values() 方法, 在遍历 key-value 的时候使用 entrySet() 是比较合理的选择。
3、如果遍历 TreeMap 的时候, 不同于 HashMap 在遍历 ThreeMap 的 key-value 时候务必使用 entrySet() 它要远远高于其他两个的性能, 同样只遍历 key 的时候使用 keySet(), 在只遍历 value 的是使用 values() 方法对于 TreeMap 也同样适用。