面试时遇到的一些问题整理

一、HashMapHashTable的区别,什么时候用HashMap,什么时候用HashTable

不必考虑线程安全问题时使用HashMap,多线程的情况下建议使用ConcurrentHashMap

二、依赖注入的类型有几种?

1.接口注入

2.set方法注入

3.构造方法注入

三、事物的特性有哪几种?

1.原子性

2.一致性

扫描二维码关注公众号,回复: 13028736 查看本文章

3.隔离性

4.持久性

四、action和spring mvc的controller分别是单例还是多例,有什么区别?

action是多例的,一个请求对应一个action,没有线程安全问题;

controller默认是单例的,多线程调用时有线程安全问题,所以要避免出现独立成员变量,如果需要成员变量,可以使用ThreadLocal

五、dubbo的provider线程池

有两种,1、IO处理线程池。(直接通过netty等来配置)。2、服务调用线程池。

服务调用线程池可以设置如下三种配置:

fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。 
cached 缓存线程池,空闲一分钟自动删除,需要时重建。 
limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。

六,hashmap、hashset相关问题

HashMap 初始大小16

使用哈希表(散列表)来进行数据存储,并使用链地址法来解决冲突

1,hashmap1.8特性

当链表长度大于等于 8 时,将链表转换为红黑树来存储

2,hashmap的增长因子

每次进行二次幂的扩容,即扩容为原容量的两倍

3,能否将一个对象两次存入hashset(物理地址相同)

根据hashmap源码,主要和hashcode相关,只要对象两次获取hashcode不相等就有可能将一个对象两次存入hashset

4,之前用数组和链表就可以实现,为什么jdk1.8要用红黑树

通过源码我们得知HashMap源码作者通过泊松分布算出,当桶中结点个数为8时,出现的几率是亿分之6的,因此常见的情况是桶中个数小于8的情况,此时链表的查询性能和红黑树相差不多,因为转化为树还需要时间和空间,所以此时没有转化成树的必要。

既然个数为8时发生的几率这么低,我们为什么还要当链表个数大于8时来树化来优化这几乎不会发生的场景呢?

首先我们要知道亿分之6这个几乎不可能的概率是建立在什么情况下的 答案是:建立在良好的hash算法情况下,例如String,Integer等包装类的hash算法、如果一旦发生桶中元素大于8,说明是不正常情况,可能采用了冲突较大的hash算法,此时桶中个数出现超过8的概率是非常大的,可能有n个key冲突在同一个桶中,此时再看链表的平均查询复杂度和红黑树的时间复杂度,就知道为什么要引入红黑树了,

举个例子,若hash算法写的不好,一个桶中冲突1024个key,使用链表平均需要查询512次,但是红黑树仅仅10次,红黑树的引入保证了在大量hash冲突的情况下,HashMap还具有良好的查询性能
5,什么是Hash冲突

两个不同对象的hashCode相同,这种现象称为hash冲突

七、aop用在项目中哪些地方?

日志、url访问权限拦截、分页、数据源注入结果集处理和资源关闭、统一异常处理、缓存、短信防刷等

八、多线程相关面试题

1,start和run有什么区别

start方法告诉cpu线程准备就绪,可以调用Run方法,直接调用Run方法不会启动新线程

2,线程有哪些方法

sleep,yield,join,daemon,setPriority

Object自带线程相关方法wait,notify,notifyAll

3,sleep和wait区别

sleep释放cpu控制权,不释放锁;

wait释放cpu控制权,释放锁

4,线程的状态转换

猜你喜欢

转载自blog.csdn.net/noob9527/article/details/72869080