- 常识
- Map集合初始化的时候,我们最好指定初始化值大小:HashMap 使用 HashMap(int initialCapacity) 初始化。
- initialCapacity如果不指定初始值大小,默认是16
- 存储容量计算方式:initialCapacity = (存储的元素个数 / 负载因子) + 1,负载因子默认是0.75,如果默认为16,那么能存储的个数为11.25个。
- 加入hashmap存放1024个元素,容量初始大小未设定为16,随着元素不断增加,经过7次扩容,需要重建 hash 表,严重影响性能。
五种方式记录map遍历
敲代码一定得要有仪式感,所以我们先把国家级运动员安排上来,存入静态map中:
private final static Map map=new HashMap<>(8);
static {
map.put("时间管理达人","罗志祥");
map.put("国家级运动员","罗志祥");
map.put("多人运动创始人","罗志祥");
map.put("黑眼圈警告","罗志祥");
map.put("深度学习","罗志祥");
}
1.keyset方式获取
@Test
public void mapTraverseByKetSet() {
StringBuilder sb = new StringBuilder();
for (String key : map.keySet()) {
String value = map.get(key);
sb.append(key + ":" + value + "\n");
}
System.out.println(sb.toString());
}
结果:
时间管理达人:罗志祥
国家级运动员:罗志祥
多人运动创始人:罗志祥
黑眼圈警告:罗志祥
深度学习:罗志祥
2.直接遍历获取value
@Test
public void mapTraverseByKetValue() {
StringBuilder sb = new StringBuilder();
for (String value : map.values()) {
sb.append(value + "\n");
}
System.out.println(sb.toString());
}
3.entrySet获取键值对
@Test
public void mapTraverseByEntrySet() {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("键值对:" + entry);
//获取 键值对的 key
System.out.println("key:" + entry.getKey());
//获取 键值对的 value
System.out.println("value:" + entry.getValue());
sb.append(entry.getKey() + ":" + entry.getValue() + "\n");
}
System.out.println(sb.toString());
}
4.iterator迭代器遍历
@Test
public void mapTraverseByIterator() {
StringBuilder sb = new StringBuilder();
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
sb.append(next.getKey() + ":" + next.getValue() + "\n");
}
System.out.println(sb.toString());
}
5.jdk8特性 forEach
@Test
public void mapTraverseByForeach() {
StringBuilder sb = new StringBuilder();
map.forEach((key, value) -> {
sb.append(key + ":" + value + "\n");
});
System.out.println(sb.toString());
}