public class bianli {
public static void main(String
[] args
) {
HashMap
<Integer,String> map
=new HashMap<>();
map
.put(1, "马太");
map
.put(2, "马可");
map
.put(3, "路加");
map
.put(4, "约翰");
bianlimethod4(map
);
}
public static void bianlimethod1(HashMap
<Integer,String> map
){
for (Integer key
: map
.keySet()) {
System
.out
.println(key
);
}
for (String value
: map
.values()) {
System
.out
.println(value
);
}
}
public static void bianlimethod2(HashMap
<Integer,String> map
){
Iterator
<Map
.Entry
<Integer,String>> iterator
=map
.entrySet().iterator();
while (iterator
.hasNext()){
Map
.Entry
<Integer,String> mapEntry
=iterator
.next();
System
.out
.println(mapEntry
.getKey()+"==="+mapEntry
.getValue());
}
}
public static void bianlimethod3(HashMap
<Integer,String> map
){
Set
<Integer> keyset
=map
.keySet();
for (Integer i
: keyset
) {
System
.out
.println(i
+"==="+map
.get(i
));
}
}
public static void bianlimethod4(HashMap
<Integer,String> map
){
map
.forEach((key
,value
)->{
System
.out
.println(key
+"---"+value
);
});
}
}
附: 1.面试题:HashMap中hash函数是怎么实现的?还有哪些hash函数的实现方式? 对于key的hashCode做hash操作,无符号右移16位然后做异或运算。 还有平方取中法,伪随机数法和取余数法。这三种效率都比较低。而无符号右移16位异或运算效率是最高的。至于底层是如何计算的我们下面看源码时给大家讲解。
2.面试题:当两个对象的hashCode相等时会怎么样? 会产生哈希碰撞,若key值内容相同则替换旧的value.不然连接到链表后面,链表长度超过阈值8就转换为红黑树存储。
3.面试题:何时发生哈希碰撞和什么是哈希碰撞,如何解决哈希碰撞? 只要两个元素的key计算的哈希码值相同就会发生哈希碰撞。jdk8前使用链表解决哈希碰撞。jdk8之后使用链表+红黑树解决哈希碰撞。
4.面试题:如果两个键的hashcode相同,如何存储键值对? hashcode相同,通过equals比较内容是否相同。 相同:则新的value覆盖之前的value 不相同:则将新的键值对添加到哈希表中