专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 2020年高级资深的Java面试题集

2020年高级资深的Java面试题集

更新时间:2019-12-19 15:07:31 来源:动力节点 浏览2598次

有哪些集合实现,对应的线程安全集合?

  主要考察集合框架的两大类:集合(collection)和图(map),集合下面主要了解list和set,如ArrayList、LinkedList、HashSet、TreeSet;map下主要了解HashMap、TreeMap。

  划重点(加分项):

  ① 线程安全集合选两个代表性的:ConcurrentHashMap和CopyOnWriteArrayList,了解它们是如何做到线程安全的。

  hashmap底层结构,为什么使用链表?(hashmap是面试必考题)

  HashMap的底层结构(数组)实现,一定要了解透彻,如put()、get()两块源码花点心思;

  hash碰撞后产生的链表、红黑树顺带了解,有能力的最好看下源码实现(加分项)。

  4、阻塞队列的实现原理?

  lock锁的多条件(condition)阻塞控制,基础薄弱的需要提前了解一下同步锁synchronized、lock及Condition类,这一块考验高级和中级研发人员的界限,需要挖一下源码,多用心。

  加分项:另外辐射出来可能会顺带直接问你AQS,建议仔细了解其实现原理,如其内部如何利用双向链表的,重点看acquire()方法实现。

  JVM篇

  内存模型(必考题)

  无论你关注jdk1.8之前还是之后,不重要,关键是能正常理解每一块的作用、是否线程共享/私有。

  堆、虚拟机栈、本地方法栈、程序计数器、方法区,需要了解每一部分的作用。

  划重点:

  虚拟机栈包含哪些部分、程序计数器的作用这两块着重了解。

  GC发生在哪一块,GC算法?

  发生在堆内存,GC算法主要了解:标记清除、复制、标记整理,需要知道其执行步骤及各自的区别。

  划重点:

  年轻代划分成哪几部分(E、S0、S1),使用哪种算法(复制),老年代使用哪种算法(标记清除),为什么?这里需要耐心理解透彻,很容易辐射到此类问题。

  MySql篇

  1、事务隔离级别,默认哪一个,解释幻读、不可重复读及二者区别?

  隔离级别:读未提交、读提交、不可重复读、串行化,默认是不可重复读,具体幻读问题,请参考笔者此前文章幻读、不可重复读,其中进行了详细说明。

  索引失效场景、索引数据结构?

  主要分为非组合索引和组合索引:

  1、非组合索引主要注意or、like(若like非左模糊情形,如xxx%,则可以使用索引),索引列存在表达式、聚合函数等等;

  2、组合索引主要注意是否遵循最左原则。

  还有些其它小点靠大家自己去积累,笔者这会是蒙圈状态,没反应过来。

  索引数据结构:主要关注B+树,花心思了解透,且需要了解聚簇索引和非聚簇索引。

  加分项:InnoDB与MyisAM索引方面的区别。

  3、数据库引擎

  主要可以说说InnoDB、MyISAM这两个常用的即可,需要了解二者的区别,InnoDB支持事务,二者使用场景,二者之间如何转变。

  4、mysql分表中间件、如何监听binlog

  中间件:tddl,MyCat(其实考验你的知识储备广度,一般不要求细说中间件的实现)。

  监听时可以使用duckula中间件或者binlog监听独立jar包(common-binlog-alone)。

  5、笔者认为高级或资深人员必须要了解的知识储备:InnoDB的MVCC机制

  mysql自身的并发控制如何实现的,原理主要从其新增、更新、删除三方面去了解其内部的操作过程,其版本号如何控制等等。

2020年高级资深的Java面试题集

  考察实际问题解决能力

  1、对于分表之后的业务常用数据,比如订单分表后,要查某段时间内的订单数据,如何实现?

  本题不能直接将一张张分表查询一遍,效率太低,偏离实际使用场景的时效性和性能,所以考虑引入中间件(比如ES),可以将业务热度较高的数据抽取出来按照用户常用查询维度进行组合存放,当实际请求过来时,直接通过es即可获取相应结果。

  注:这种方式也适用于DB的减压,若问到DB如何减压也可以这么回答。

  比如下单之后有很多相应的数据都要同步修改,但是这类数据都不在同一个应用服务和数据库中,有什么方式可以达到数据的最终一致性?

  这一题笔者给出两种思路(笔者倾向于后一种方式):

  ①使用消息,不同数据对应其所在的服务进行消息监听,进而获取消息后进一步修改,当然不能排除消息丢失的情况,所以需要进一步完善;

  ②可以监听binlog,当下单数据变更后,直接通过监听到的binlog的数据变更结果之后,根据具体需要进行对应的后续处理。

  cup飙升如何排查?

  具体说下思路:

  ① 先要ps -ef | grep java获得java进程,然后使用top命令获取cpu使用较高的线程;

  ② 使用jstack -l pid > /tmp/xxxx.log将堆栈情况输出到文件中便于后续查看;

  ③将top中cpu使用率较高的线程id转换成16进制去上一步的文件中查找,大多数情况下可以定位出一些眉目;

  ④如果仍然没有头绪,接着使用jmap导出堆的dump文件,并使用Eclipse的插件进行查看,比如找到问题对象进行实际代码分析。

  现场编程

  1、将单链表逆序输出,不能改变单链表的结构(比如不允许将单链表改造成双向链表)

  这一题笔者给出两个思路:

  ① 简单点考虑可以借助栈来实现,顺序压栈后直接栈顶顺输出即可;

  ② 当然,如果要求不允许借助栈来实现,那就需要递归的思想,设置两个指针变量a和b(a->b),分别指向表头前两个节点,使得a指向的节点为b指向的节点的后继,再利用一个临时变量,逐步后移a、b直到b为空即可。

  2、电影院选座位,共n个座位,每个座位票价不一样,找出连续的m个座位,使其票价总和最小。

  这一题笔者直接理解为那个元素的数组(元素都是数值),找出m个连续的数字使其总和最小,给出起始点的下标即可。

  可以直接顺序查找,每次计算出的m个元素的总和值保存在临时变量中,例如若使用map,则key为下标,value为sum值,记住不要过多浪费空间,并不需要每个下标都存放进去,只要存放一个即可,然后依次遍历数组下标,比较sum值(较小的放进map,同时为了保证节省空间,放进map前进行清空map,使map始终只有一个元素),最终能获取到最小的sum,拿出map的为一个键值对,即获取到起始下标。

  一般现场编程题不会太难,毕竟不是让你现场ACM,而是着重考察面试者是否保留了过硬的动手能力,而不是只会CURD,但是算法还是需要日常积累才能自如应付。

2020年高级资深的Java面试题集

      以上就是动力节点Java培训机构小编介绍的“2020年高级资深的Java面试题集”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

相关推荐

最新最全java面试题及答案(初级到高级)

史上最全的中高级JAVA工程师面试题及答案汇总

Java高级开发工程师面试题

2019史上最全java面试题题库大全800题

哪有资深java工程师面试题

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>