高级、资深Java面试题,附答案!需要高薪的你请拿去

这篇具有很好参考价值的文章主要介绍了高级、资深Java面试题,附答案!需要高薪的你请拿去。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言 

在这个金三银四的黄金季,献给大伙奉上一套热腾腾的大厂面试题,来自朋友的面试经历(2面技术+1面hr),由于朋友还没入职,不让我透露具体公司,但是绝对是大厂不假(想知道可以先下偷偷告诉你,或者让朋友给你内推),笔者收集整理了一下,废话不多说,直接进入正题。

以下给出了每一题思路及方向,后续还需要更多资料的小伙伴们看文末,希望能给你们一下帮助。

技术一面——考察知识深度

java基础篇

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

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

划重点(加分项):

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

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

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

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

3、线程池常用参数、如何设置?

核心线程数、最大线程数、阻塞队列容量、线程空闲时间及单位、拒绝策略,每个的具体含义一定要了解。

划重点:

当线程数小于核心线程数时,创建线程。

当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。

当线程数大于等于核心线程数,且任务队列已满:

若线程数小于最大线程数,创建线程若线程数等于最大线程数,看拒绝策略

如何设置具体参数值(个人经验及看法,供参考):

核心线程数 = 每秒需要处理的最大任务数量 * 处理一个任务需要的时间,业界有常用的8020原则、6040原则,实际还是要根据自己应用的承载能力来看,假设系统每秒任务数为10~100,每个任务耗时0.1秒,则需要10*0.1~100*0.1,即1~10个线程。那么corePoolSize应该设置为大于1,若根据8020原则,即80%情况下系统每秒任务数不超过20,则corePoolSize=0.1*20=2。

阻塞队列容量 = 核心线程数 / 处理一个任务需要的时间 * 系统允许任务最大的响应时间

最大线程数 = (每秒需要处理的最大任务数量 - 队列容量)*每秒的线程处理任务能力,假设每秒200个任务需要20个线程,那么当每秒达到1000个任务时,则需要(1000-队列容量)*(20/200),即60个线程。

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

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

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

JVM篇

1、内存模型(必考题)

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

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

划重点:

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

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

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

划重点:

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

MySql篇

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

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

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

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

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

中间件篇

1、消息队列用过哪些:kafka、rabbitMq、rocketMq?

以kafka为例,一定要能手绘kafka的逻辑结构图,知识点主要被问到两方面:

零拷贝:磁盘文件的数据复制到页面缓存中,然后将数据从页面缓存直接发送到网络中,不用重复从磁盘取数据。

kafka延时队列怎么实现:时间轮,需要细致了解其如何将消息遍布其中并且延时取出。

怎么保证消息有序:这个有序的前提是在partition层面,其中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,进而保证了其有序性。

kafka如何保证消息高可用:着重去了解ISR机制和复制机制,很难细说清楚,需要花时间了解。

kafka的事务是如何实现:三两句是说不清的,主要从幂等性发送和事务性保证两方面来回答,具体给几个小点供参考(1、引入内部Topic作为事务log;2、引入transactionId做同一事务判断;3、引入事务协调者;4、引入控制消息让broker通知消费者消息是否被原子性提交,并对使用者透明,不可见),参考点并不完全,需要读者用心自行完善。

加分项:

若使用过不止一种消息队列,最好能知晓其之间的差异或者优劣势。

2、搜索中间件使用过哪些,ES?

ES索引结构:index/type/id,类比关系型数据库:index=database,type=table,id=id。

ES分片:主要了解主分片(不可修改)与副分片(可以修改),主分片与对应的副分片不能存放同一个节点下,查询时主、副都是查询,es会择优返回结果。另外,分片路由算法了解一下:分片=hash(routing)%主分片数,routing一般可以使用id。

笔者建议还要了解下ES中的删除其实不是物理删除,具体如何删的有兴趣可以自行了解,属于加分项

3、缓存使用过什么,redis?

redis常用数据类型:String、List、hash、set、zset等等,使用场景最好也事先想清楚,100%会被问到。

redis集群架构模式:哨兵模式、主从模式、cluster模式,具体原理需要细致了解,大概率会被问到。

redis如何实现延时消息:此题考验临时给定场景的解决问题能力,其实笔者还是觉得考察的是对redis数据类型的熟悉程度。笔者给的思路是使用zset类型,将延时的时间点作为score进行存放,使用时启用一个轮询任务按照允许的时间间隔进行轮询取出一定量的数据,使用zrangeByScore方法根据score排好序的结果,使用完记得zrem删除避免重复消费,当然其中需要你控制好如何在删除之前避免并发的重复消费。

技术二面——考察实际问题解决能力

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

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

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

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

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

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

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

3、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,但是算法还是需要日常积累才能自如应付。

更多资料:高级、资深Java面试题,附答案!需要高薪的你请拿去高级、资深Java面试题,附答案!需要高薪的你请拿去高级、资深Java面试题,附答案!需要高薪的你请拿去

 高级、资深Java面试题,附答案!需要高薪的你请拿去

高级、资深Java面试题,附答案!需要高薪的你请拿去 

感兴趣且需要的小伙伴看文末领取即可 文章来源地址https://www.toymoban.com/news/detail-407098.html

到了这里,关于高级、资深Java面试题,附答案!需要高薪的你请拿去的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【2023,学点儿新Java-14】携程面试题:如何看待Java是一门半编译半解释型的语言?| 咨询互联网行业 资深前辈的一些问题 | 附:为什么说ChatGPT的核心算法是...?| GPT-3.5

    前情回顾: 【2023,学点儿新Java-13】阶段练习之Java面试企业真题(阿里巴巴拼多多 等) | 常用的Java命令行操作都有哪些 | 如何解决Java的内存泄漏和内存溢出问题? 【2023,学点儿新Java-12】小结:阶段性复习 | Java学习书籍推荐(小白该读哪类Java书籍?有一定基础后,再去读

    2024年02月09日
    浏览(38)
  • webpack (常问高薪面试题11道)(20220401)

    目录 1、什么是 webpack(必会) 2、webpack 的优点是什么?(必会) 3、webpack 的构建流程是什么?从读取配置到输出文件这 个过程尽量说全(必会) 4、说一下 webpack 的热更新原理(必会) 1、基本定义 2、核心定义 5、webpack 与 grunt、gulp 的不同?(必会) 6、有哪些常见的 Loader?他

    2024年02月09日
    浏览(27)
  • Android 外部存储与内部存储详解,高级UI都没弄明白凭什么拿高薪

    FileOutputStream fos = new FileOutputStream(path, true); String str = infoEdt.getText().toString(); fos.write(str.getBytes()); } catch (IOException e) { e.printStackTrace(); } break; case R.id.read_btn: try { FileInputStream fis = new FileInputStream(path); byte[] b = new byte[1024]; int len = fis.read(b); String str2 = new String(b, 0, len); txt.setText(str

    2024年04月11日
    浏览(29)
  • Java面试题经典面试题220道(附答案)

    继续找工作,现在的很多程序员还在谈技术,谈这个就没劲了其实,因为现在的失业是结构性失业。 比如说你到40岁了,你还有大厂履历,那你毕业了以后,找工作的难度肯定会加大。一方面是新工作的待遇和薪资往往不及预期,另一方面就是竞争激烈。 而我认识的两个猎头

    2024年02月17日
    浏览(35)
  • 2023Java面试题(附答案)

    精选Java面试题162道 什么是Java,Java的优点是什么? Java是一种面向对象的编程语言,请解释面向对象的概念是什么? Java编程语言有哪些数据类型? 什么是Java中的Wrapper类?包装类有哪些? Java中的基本类型和其对应的包装类有哪些? 什么是Java中的String类?可以对一个String对

    2024年02月03日
    浏览(34)
  • Java经典面试题包含答案

    1.简单易学、有丰富的类库 2.面向对象(Java最重要的特性、让程序耦合度更低、内聚性更高) 3.与平台无关性(JVM是Java跨平台使用的根本) 4.可靠安全 5.支持多线程 面向过程:== 是分析解决问题的步骤、然后是由函数将这些步骤一步步的实现,然后在使用时一一调用即可。性能较

    2024年02月11日
    浏览(32)
  • java面试真题&附参考答案【下册】

    tips:下面简述题为java面试真题,阅读本文且感兴趣的,还有将要面试的小伙伴有条件的准备一下 笔和纸 ,将之转述出来成为自己的知识,希望接下来的面试好运连连 上一册:java面试真题【上册】_CsDn.FF的博客-CSDN博客 目录 11.数据库连接池是什么?为什么需要使用连接池?

    2024年02月15日
    浏览(31)
  • java面试题及答案(基础篇)

    如今IT仍是热门行业,面试程序员的人也非常多,那么,怎样才能顺利通过面试呢?2021最新java面试题及答案(基础篇),为你的面试助攻! 1、Java中的内存溢出是如何造成的? OutOfMemoryError: (1)PerGern Space 程序中使用了大量jar或class,使Java虚拟机装载类空间不够。 解决方

    2024年02月12日
    浏览(36)
  • Java经典面试题下包含答案

    线程安全: String中的对象是不可变的,线程安全 StringBuffer对方法加了同步锁,所以是线程安全的 StringBuilder没有对方法加同步锁,所以是非线程安全的 使用效率: String进行操作时,每次都会生成一个新的String对象,然后将指针指向新的String对象。 而StringBuffer和StringBuilder每

    2024年02月12日
    浏览(29)
  • 【面试】Java面试频繁问到的题最新整理(附答案)

    封装 :对象只需要 选择性的对外公开一些属性和行为 。 继承 :子对象 可以继承父对象的属性和行为 ,并且可以在其之上进行修改以适合更特殊的场景需求。 多态 : 允许不同类的对象对同一消息做出响应 。 数据类型 占用字节 byte 1 short 2 int 4 long 8 float 4 double 8 char 2 boo

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包