今日干货分享!3年java开发入职有赞经历,Java工程师社招面试分享!

前言

今天给大家分享了一波粉丝分享过来面试有赞的干货面试题,由于时间关系答案我都帮大家整理好了,大家自行观看就好了!

HashMap原理

(1)hashMap 是非线程安全的, hashMap 1.7的底层实现为数组(table[])+链表(LinkList–>Entry),hashmap 1.8底层为数组+链表/红黑树(当链表长度到达阈值TREEIFY_THRESHOLD(默认为8)时,会转化为红黑树)

put和resize过程

(1)put过程:

①查看数组是否需要初始化

②根据key计算hashcode

③根据hashcode计算出桶位置

④遍历链表,查看key值与链表节点的key值是否相等,如果相等的话,那么进行覆盖旧值,并返回旧值。1.8的话需要先查看链表长度是否达到阈值,如果达到阈值,先进行红黑树转化然后再进行检查扩容。

⑤新增的时候需要检查是否需要扩容,需要扩容的话进行两倍扩容,扩容完成后进行插入新值。

(2)resize过程:

resize扩容需要从四个方面来进行回答:

①什么时候触发resize? 当容量超过当前容量(默认容量16)乘以负载因子(默认0.75)就会进行扩容,扩容大小为当前大小的两倍(扩展问题,为啥是两倍:通过限制length是一个2的幂数,h & (length-1)和h % length结果是一致的)。

②resize是如何hash的:h & (length-1)

③resize是如何进行链表操作的:使用头插法进行数据插入,每次新put的值放在头部

④并发操作下,链表是如何成环的:HashMap的环:若当前线程此时获得ertry节点,但是被线程中断无法继续执行,此时线程二进入transfer函数,并把函数顺利执行,此时新表中的某个位置有了节点,之后线程一获得执行权继续执行,因为并发transfer,所以两者都是扩容的同一个链表,当线程一执行到e.next = new table[i] 的时候,由于线程二之前数据迁移的原因导致此时new table[i] 上就有ertry存在,所以线程一执行的时候,会将next节点,设置为自己,导致自己互相使用next引用对方,因此产生链表,导致死循环。

线程池有哪些类型

①FixedThreadPool:创建可重用固定线程数的线程池。

②SingleThreadPool:创建只有一个线程的线程池。

③CachedThreadPool:一个可根据需要创建新线程的线程池,如果现有线程没有可用的,则创建一个新线程并添加到池中,如果有被使用完但是还没销毁的线程,就复用该线程。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。

④ScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

ConcurrentHashMap分段锁原理

(1)ConcurrentHashMap采用了分段锁技术,其中Segement继承了RecentLock,当ConcurrentHashMap进行get、put操作时,均是同步的。各个Segement之间的get、put操作可以进行并发,即当一个线程访问ConcurrentHashMap的Segement时,不会影响对其他Segement的访问。

java8和java7实现的区别

(1)java7的实现:java7采用数组+链表的底层数据结构实现。

(2)java8的实现:由于java7的实现在链表查询遍历元素的时候,时间复杂度为O(n),当一个Segement的链表元素过多时,性能表现不是很好,因此Java8采用数据+链表/红黑树的方式实现。当链表的长度大于阈值8时,会转化成红黑树。其中抛弃了原有的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。

(3)总的来说三点区别:

①数组+链表—>数据+链表/红黑树

②分段锁RecentLock—>CAS + synchronized

③HashEntry—>Node

B-树和B+树区别

(1)B-树和B树是一个概念,是多路搜索树(相比于二叉搜索树,IO次数更少)。B-树的特性:

①关键字集合分布在整颗树中;

②任何一个关键字出现且只出现在一个结点中;

③搜索有可能在非叶子结点结束;

④其搜索性能等价于在关键字全集内做一次二分查找;

⑤其最底搜索性能为O(logN)

(2)B+树是B-树的变体,也是一种多路搜索树 B+的特性:

①所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

②不可能在非叶子结点命中;

③非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

④更适合文件索引系统;

(3)B+树的优势:

①单一节点存储更多的元素,使得查询的IO次数更少。

②所有查询都要查找到叶子节点,查询性能稳定。

③所有叶子节点形成有序链表,便于范围查询。

数据库索引原理

(1)MyISAM索引实现:MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。

(2)Innodb索引实现:

①第一个重大区别是InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

②第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。

组合索引怎么使用?最左匹配的原理。

(1)组合索引怎么使用?

例如组合索引(a,b,c),组合索引的生效原则是:

从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面(范围值也算断点,orderby不算断点,用到索引)的索引部分起作用,断点后面的索引没有起作用;

(2)最左匹配的原理:以最左边的为起点任何连续的索引都能匹配上

Spring生命周期

Bean 的生命周期概括起来就是 4 个阶段:

(1)实例化(Instantiation)

(2)属性赋值(Populate)

(3)初始化(Initialization)

(4)销毁(Destruction)

Spring几种scope区别?

(1)singleton:Spring的IOC容器中只有一个实例bean,该值为scope的默认值

(2)prototype:每次getBean时都会创建一个新的实例

(3)request:每次请求都会创建一个实体bean

(4)session:每次session请求时都会创建一个实体bean

(5)globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。

Spring AOP实现有哪几种实现,接口代理和类代理会有什么区别?

(1)Spring AOP有两种实现,均为动态代理:

①JDK动态代理:基于反射进行动态代理,核心类是InvocationHandker类和Proxy类,被代理的类必须实现接口

②CGLIB动态代理:被代理类无需实现接口,主要实现MethodInterceptor接口即可实现代理

(2)Spring AOP如果代理的类存在接口,优先使用JDK动态代理,否则使用CGLIB动态代理。

斐波拉契数列非递归实现

这道牛客题霸上有原题,大家可以去看看:NC65 斐波那契数列
最后我为大家准备了一些Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等,点击这里免费获取。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47277170/article/details/112561760