刚斩获头条美团的offer,Java开发面试题详解(带答案)

      出于篇幅考虑,这篇文章只给出了10个专题,每个专题给出了大约4道题的答案,包含Java基础、Jvm、开源框架知识、操作系统、多线程、网络知识、架构设计与分布式数据库知识、消息队列、缓存等,更多专题持续更新中,争取三天内发出来。

     自我准备面试的过程,当时网上找了些试题,但是没答案,然后一边梳理自己的知识,一般结合自己平时钻研的知识和工作经验,自己对试题进行了整理,解答。如果想要完整版的可于文末自行领取。

     也凭借着这次梳理,面试一路过关斩将,offer收割率100%。面了头条,和美团的3个事业部,均收获offer。

也预祝各位校招的朋友,斩获满意的offer。

一、Java基础

1. String, Stringbuffer, StringBuilder 的区别。

答:String 是 final 类,⽆法继承,也⽆法被修改,每次修改都会创建新的 String 对象。

Stringbuffer 和 StringBuilder 则能正常被修改,两者的区别是 StringBuffer 每个方法都加了锁,是线程安全的。

2. JAVA8 的 ConcurrentHashMap 为什么放弃了了分段锁,有什么问题吗,如果你来设计,你如何设计。

答:在 1.8 之前, ConcurrentHashMap 通过一个大⼩为 16 的 Segment 数组,这 16 个Segement 继承自 ReenterLock,类似 16 把锁均匀的维护着所有的桶。每次写操作将会锁住 1 个 segment 下所有的桶,锁力度较大,会降低支持的并发数。所以 1.8 进行了优化,采用了更细力度的锁, hash 后,如果没有相关的桶,不加锁,直接通过 Unsafe 的类似 CAS 操作将值放入,如果有桶,则对这个桶加锁,其他桶的节点依然可以正常操作

3. 继承和聚合的区别在哪。

答:继承主要描述的是‘A is B’的关系,而聚合描述的是‘A has B’的关系,一般情况下,优先使用聚合,因为继承可能会继承父类中一些不必要的属性和方法。但是,如果需要向上转型,就需要用继承。

4. 反射的原理,反射创建类实例的三种方式是什么。

答:当⼀个类加载完成后,会生成一个 Class 对象, Class 对象可以获取类的所有属性,⽅法等数据。

⽅式一:对象调用 getClass()方法

⽅式二:类名.class

⽅式三:Class.forName(全路径名称)

创建 class 对象后,直接调用 class 对象的 newInstance()方法即可创建实例

二、Jvm

1. Jvm 包括那⼏大部分。

答:主要包含 4 个部分:类加载器,字节码执行引擎,内存模型,本地方法调⽤。

2. 什么情况下会发生栈内存溢出。

答:一般在递归调用的时候容易发生。

虚拟机栈描述的是 Java 方法执行的内存模型,每个⽅法的执行都会创建一个栈帧,用于保存局部变量表, 操作数栈,动态链接,方法出口等信息。

如果请求的栈深度大于虚拟机所允许的最大深度,将抛出 StackOverFlowError,如果无法申请所需的内存,则会抛出 OutOfMemoryError。

3. JVM 内存为什么要分成新生代,⽼年代,持久代。新生代中为什么要分为 Eden 和Survivor。

答:分为新生代,⽼年年代和持久代是为了不同的区域根据特点采用不同的 GC 策略,例如新生代对象⼀般是朝⽣夕死,一般采⽤复制算法,区分进一步分为一个 Eden 和两个Survivor 区域。而老年代和持久带则一般采⽤标记清除算法。

4. 详细介绍下 CMS 垃圾回收器器。

答:CMS 是⽼年代垃圾回收器,⽬标是最短的停顿时间。它的⼯作主要包括 4 个阶段:

(1)初始化标记,主要是标记老年年代中被 GCroots 和新生代引用的对象,需要 STW

(2)并发标记:从第一步对象开始,并发的完成标记

(3)重新标记:因为第二步是并发完成的,过程中对象引用可能发生变化,这一步主要是保证实际清理前标记是正确的,需要 STW

(4)并发清除:对标记对象并发进行清除<

你可能感兴趣的:(Java面试,Java编程,Java,java,面试,开发语言)