2-2 HashTable-LinkedHashMap-各个map的区别-hashset

上一篇:
2-1 HashMap-ConcurrentHashMap

这里是easy的java基础面试
下面是总的阅览:

java基础
java集合
JVM
多线程
mysql_数据库
计算机网络
nosql_redis
设计模式
操作系统
消息中间件activeMq
SSM框架面试题
服务中间件Dubbo

1-HashTable

1-1-参数

(1) table 是一个 Entry[]数组类型,而 Entry 实际上就是一个单向链表。哈希表的
"key-value 键值对"都是存储在 Entry 数组中的。
(2)count 是 Hashtable 的大小,它是 Hashtable 保存的键值对的数量。
(3)threshold 是 Hashtable 的阈值,用于判断是否需要调整 Hashtable 的容量。
threshold 的值=“容量*加载因子”。
(4)loadFactor 就是加载因子。 == 0.75
(5)modCount 是用来实现 fail-fast 机制的 modCount是修改次数

注意: hashtable在 hashmap的基础上 给 get put remove方法加上 synchronized修饰。并且key value 都不为null
扩容: 默认容量为 11 ,扩容增量为2 * 原始数组长度 + 1
线程安全,但是有同步操作,会很慢。

2-hastable和hashmap的区别

类别hashtablehashmap
方法同步方法未同步
允许Nullkey/value都不允许为 null允许(key / value)
遍历方式比map多个elements方法。通过values返回一个Collection遍历 / entryset遍历没有elements方法
使用Enumerationiterator
哈希值的不同使用直接使用对象的hashcode重新计算 hash值
数组大小及扩容默认为11, 2 * 原始大小 + 12^n 2^n * 2
基于类基于Dictionary类基于abstractMap类

3-ConcurrentHashMap和hashTable区别

类别ConcurrentHashMapHashTable
锁定范围仅仅锁定的是 map的某个部分锁定整个map
具体的措施1.7分段锁,每一把锁只锁定容器的某个部分,且锁在代码块中。多线程下,访问容器不同数据段的数据,就不会造成锁竞争。提高了并发访问率。使用synchronized 保证线程安全,但效率非常低下。多线程下,会造成阻塞/轮训状态,如使用put ,另一线程不能put新元素,也不能get。 竞争会越来越激烈,效率越低。

4-LinkedHashMap重要(Lru算法的实现哦)

结构: 由hashmap + linkedList(双向链表)实现。

https://blog.csdn.net/justloveyou_/article/details/71713781

linkedHashMap

4-1LinkedHashMap与hashMap的区别

类别LinkedHashMapHashMap
是 hashmap的子类extends abstractMap
节点在 Entry中增加了 before 和 after指针,分别维护双向链表。
put在hashmap中插入新的entry时,还会addBefore方法,将其加入双向链表中,给双向链表head添加一份。正常
扩容对其中的重哈希过程transfer方法重写。(因为有双向链表)正常
get方法getEntry获取 Entry 在此基础上,进一步获取指定键对应的值。

5-HashSet

5-1 原理

对于 HashSet 而言,它是基于 HashMap 实现的
Hashset 源码 http://zhangshixi.iteye.com/blog/673143
Hashset 如何保证集合的没有重复元素?
可以看出 hashset 底层是 hashmap 但是存储的是一个对象,hashset 实际将该元
素 e 作为 key 放入 hashmap,当 key 值(该元素 e)相同时,只是进行更新 value,并不会新增
加,所以 set 中的元素不会进行改变。

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
  static final long serialVersionUID = -5024744406713321676L;

   private transient HashMap<E,Object> map;

   // Dummy value to associate with an Object in the backing Map
   private static final Object PRESENT = new Object();

   /**
    * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
    * default initial capacity (16) and load factor (0.75).
    */
 public HashSet() {
     map = new HashMap<>();
 }
add() 方法

在这里插入图片描述

public boolean add(E e) {
	return map.put(e, PRESENT)==null;
}

5-2hashmap和hashset区别

hashmaphashset
实现了map接口实现了 set接口
存储键值对存储对象
调用put 向map中放入值add方法
hashmap使用key计算hashcode直接使用成员对象来计算hashcode
hashmap相对 hashset较快,因为他是使用唯一键获取对象hashset较 hashmap来说比较慢。

下一篇:
2-3 Collections.Sort-Iterator-ArrayList和Vector和LinkedList-深拷贝浅拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下次遇见说你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值