HashMap,HashTable,CocurrentHashMap的共同点和区别
共同点:
- 底层使用拉链式数组
- 为了避免
hash冲突,当当数组元素已用槽数量超过(容量*容载因子)就会扩容 put时,对key进行hash计算槽,若槽没有元素则赋值,否则插入链表的结尾get时,对key进行hash计算槽,若槽没有元素或者仅有一个元素,则直接返回, 否则,通过equals方法比较key,返回指定的元素
不同点:
HashTable的key和value不允许nullhash方法不同,HashTable直接对hashcode进行取模运算,HashMap首先对hashcode进行扰动计算,尽量避免 hash 碰撞。然后因其数组长度恒定为,所以直接通过与运算进行取模,HashMap线程不安全,HashTable通过synchronized修改关键方法确保线程安全,CoccurentHashMap通过分段锁的方式实现
说出几种幂等的实现方式
幂等操作指任意多次执行的结果和执行一次的结果一样。通俗来说,就是同一用户的对同一操作的多次请求的结果是一致的。
保证幂等性主要是三点:
- 对于同一操作的请求必须有唯一标识,例如订单支付系统,肯定包含订单
ID,确保一个订单仅支付一次。 - 处理请求时需要有标识记录操作的状态,如正在处理中,已经处理完成等。
- 每次接受请求时,需要判断是否已经处理过该请求或者正在处理该请求。
实现方式:
- 分布式锁
- 数据库锁
- 事务
Spring的init-method,destroy-metdho的实现方式
根据spring_initMethod执行过程的分析,我们可以知道Spring在扫描bean的配置信息时,将 init-method,destroy-metdhod的信息存储在BeanDefinition中,在bean的生命周期的一开始即实例化bean,以及对bean的属性进行初始化赋值后,会查找当前BeanDefinition,是否有init-method方法,有则通过反射去执行。在bean的生命周期的最后,会查找当前BeanDefinition,是否有destroy-metdhod方法,有则通过反射去执行。