Map接口的特点
- Map用于保存具有映射关系的数据:key,Value
- 补充:Collection接口 也是有映射关系的,底层Value 让一个static Object类的方法代替了
- Map中的key不允许重复,和HashSet一样,Value可以相同
- Map中的Key和Value可以是引用数据类型
- 在添加的时候,如果HashMap中,已经有Key值相同的元素,会替换掉旧的,用新的(value被替换)
- HashMap.get()传入一个Key可以得到Value,因为Key没有重复
- HashMao是没有实现线程同步的,因此是线程不安全的
HashMap底层分析(可以看我前面分析的HashSet)
![]()
Hashtable
- Hashtable的键和值都不能为null
- Hashtable是线程安全的
- 扩容机制:(当前大小不 * 2+1)一开始是11个空间,当到达11*0.75 = 8个时,就会扩容到23个(11 * 2 + 1)
Hashtable和HashMap比较
![]()
proprites
![]()
开发中如何选择集合
![]()
Map接口的遍历
import java.util.*;
public class text {
public static void main(String[] args) {
HashMap hm = new HashMap<>();
hm.put(1, "平凡晨");
hm.put(2, "库里");
hm.put(3, "霍华德");
hm.put(null, "科比");
hm.put(4, "詹姆斯");
hm.put(5, "tom");
hm.put(6, "jack");
//得到所有的key
Set<Object> ks = hm.keySet();
System.out.println("=======第一种方式=======");
//第一种方式 增强for循环 遍历key
for (Object key : ks) {
System.out.println(key);
}
System.out.println("=======第二种方式=======");
//第二种方式 通过迭代器 遍历key的值
Iterator<Object> iterator = ks.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("=======第三种方式=======");
//第三种方式 取出所有 key 和 value
for (Object key : ks) {
System.out.println(key + " " + hm.get(key));
}
System.out.println("=======第四种方式=======");
//第四种方式 通过迭代器 遍历key 和value
Iterator<Object> iterator1 = ks.iterator();
while (iterator1.hasNext()) {
Object next = iterator1.next();
System.out.println(next + " " + hm.get(next));
}
//得到所有的value
Collection values = hm.values();
System.out.println("=======第五种方式=======");
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
System.out.println(iterator2.next());
}
// 通过 EntrySet 来获取 k-v
Set set = hm.entrySet();
System.out.println(set);
System.out.println("=======第六种方式=======");
Iterator iterator3 = set.iterator();
while (iterator3.hasNext()) {
Object next = iterator3.next();//HashMap$Node -实现-> Map.Entry (getKey,getValue)
//向下转型
Map.Entry m = (Map.Entry)next;
System.out.println(m.getKey() + "-" + m.getValue());
}
System.out.println("=======第七种方式=======");
for(Object s :set){
Map.Entry m = (Map.Entry) s;
System.out.println( m.getKey() +"-"+ m.getValue());
}
}
}