1、HashMap与HashTable的区别
HashMap | HashTable | |
---|---|---|
是否线程安全 | 非线程安全,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合 | 线程安全 |
是否允许null值作为key | 允许null值作为key | 不允许null值作为key |
初始容量 | 16 | 11 |
效率 | 相对稍高 | 相对稍低 |
计算hash的方法 | 对key的hashcode进行二次hash(以获得更好的散列值)然后对table数组长度取模 | 计算key的hashcode并对table数组长度进行取模 |
2、HashMap与HashSet的区别
HashSet相当于简化版的HashMap
HashMap | HashSet | |
---|---|---|
接口实现 | 实现了Map接口 | 实现了Set接口 |
存储目标 | 存储键值对(Key-Value) | 仅存储对象 |
添加元素的方法 | put() | add() |
计算hashcode | 计算key的hashcode值 | 使用成员对象来计算hashcode值,两个对象的hashcode值可能相同,所以需要利用equals()方法来判断对象是否相等 |
速度 | 相对较快 | 相对较慢 |
3、HashMap的使用
/*HashMap测试*/
HashMap<String, Integer> hashMap = new HashMap<>();
//1、添加键值对put()
hashMap.put("a",1);
hashMap.put("b",2);
hashMap.put("c",3);
hashMap.put("c",33);//使用put()方法添加元素时,元素的key不能重复,若重复则会覆盖之前的value值
//2、获取指定key的value值get()
System.out.println(hashMap.get("c"));//输出结果:33
//3、获取集合中键值对的数量size()
System.out.println(hashMap.size());//输出结果:3
//4、判断集合是否为空isEmpty()
System.out.println(hashMap.isEmpty());//输出结果:false
//5、删除键为key的键值对并返回其value值
System.out.println(hashMap.remove("a"));//输出结果:1
//6、返回集合中所有key组成的Set集合keySet()
Set<String> set=hashMap.keySet();
for (String key:set){
System.out.println(key);
}//输出结果:b c
//7、返回集合中所有value值组成的以Collection数据类型格式数据values()
Collection<Integer> collection=hashMap.values();
for (Integer value:collection){
System.out.println(value);
}//输出结果:2 33
//8、将集合中每个键值对转换为Entry对象并返回所有Entry对象组成的Set集合entrySet()
Set<Map.Entry<String,Integer>> entries=hashMap.entrySet();
for (Map.Entry<String,Integer> entry:entries){
System.out.println(entry.getKey()+":"+entry.getValue());
}//输出结果:b:2 c:33
//9、清空集合所有键值对clear()
hashMap.clear();
System.out.println(hashMap.size());//输出结果:0
4、HashSet的使用
/*HashSet测试*/
HashSet<Integer> hashSet = new HashSet<>();//创建
//1、添加元素add()
hashSet.add(1);
hashSet.add(2);
hashSet.add(3);
hashSet.add(1);
for (int i:hashSet){
System.out.println(i);//输出结果:1 2 3
}
//2、获取集合元素个数size()
System.out.println(hashSet.size());//输出结果:3
//3、删除指定元素remove()
hashSet.remove(3);
for (int i:hashSet){
System.out.println(i);//输出结果:1 2
}
//4、判断集合是否为空
System.out.println(hashSet.isEmpty());//输出结果:false
//5、判断集合是否包含指定元素contains()
System.out.println(hashSet.contains(2));//输出结果:true
//6、清空集合clear()
hashSet.clear();
System.out.println(hashSet.size());//输出结果:0
5、HashTable
HashTable的操作几乎和HashMap一致,主要的区别在于HashTable为了实现多线程安全,在几乎所有的方法上都加上了synchronized锁,而加锁的结果就是HashTable操作的效率比较低。
HashTable现在基本已被淘汰,单线程转为使用HashMap,多线程使用ConcurrentHashMap(详解见链接:https://www.itqiankun.com/article/concurrenthashmap-principle)