自己总结 给初中级JAVA准备的面试题,致竞争激烈的秋招面试

 前言:大家好,哈哈好久不见啊我来了 。时隔一个星期终于有时间来写文章了,说一下为什么停更了这么久,主要是因为最近项目上线,本人忙着改bug上线,最近的头发都少了不少呢,就挺秃然的 。。。上线之后忐忑了一天,发现还可以只出现了一些小毛病,哈哈又逃过一劫,每次上线就像考试一样 。
最近不是要秋招了嘛,今年因为疫情的原因比往年更加激烈,不少刚毕业的小伙伴向我吐槽说,今年不知道该怎么找工作 。可能毕业生刚毕业没有工作经验,但是我们有一个优势就是小白思维没有那么固化,所以有一些公司还是喜欢毕业生的,大家不要害怕,只要你基础好,好学思维强,面试还是能过的 。今天我就分享一些JAVA初中级面试题给大家,祝大家能够拿到想要的offer,乘风破浪,未来可期!
 

自己总结 给初中级JAVA准备的面试题,致竞争激烈的秋招面试

文章插图
 
1.hashmap相关HashMap一直是经典的面试题,所有面试官都喜欢问他,因为它可以牵扯出非常多的知识点,而面试者到底能了解到何种程度,则一定程度反映其综合能力 。细节聊扩容因子LoadFactor=0.75,初始大小InitailCapacity=16纵向聊其底层实现,数据结构是数组+链表,提到jdk1.8之后对链表节点到达8之后转换为红黑树加分 。继续追问的话便是引申出常用的数据结构:队列,栈,树,图 。横向聊线程安全,HashMap为线程不安全,一般问多线程操作会导致其死循环的原因 。与线程安全的ConcurrentHashMap对比,又扩展到ConcurrentHashMap的实现 。继续追问的话便是引申出线程安全的定义,问一些常用的并发容器,考察面试者对java.util.concurrent包的掌握情况 。那么至少可以牵扯出如下的问题:
ConcurrentHashMap相关
面试者可以先说历史,1.8之前采用分段锁,核心就是一句话:尽量降低同步锁的粒度 。1.8之后使用CAS思想代替冗杂的分段锁实现 。不出意料,面试者答出CAS之后必定会被追问其思想以及应用,换做我自己的话会有如下思路作答:CAS采用乐观锁思想达到lock free,提一下sun.misc.Unsafe中的native方法,至于CAS的其他应用可以聊一聊Atomic原子类和一些无锁并发框架(如Amino),提到ABA问题加分 。
2.线程安全与锁线程安全这个词也是面试的高频词,说完上面的并发容器,回头说一说线程安全的定义,按照周志明大大的话回答私以为是极好的:
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替进行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么称这个类是线程安全的
通常与锁一起出现:除了synchronized之外,还经常被问起的是juc中的Lock接口,其具体实现主要有两种:可重入锁,读写锁 。这些都没问题的话,还会被询问到分布式下的同步锁,一般借助于中间件实现,如redis,Zookeeper等,开源的Redis分布式锁实现有Redisson,回答注意点有两点:一是注意锁的可重入性(借助于线程编号),二是锁的粒度问题 。除此之外就是一些juc的常用工具类如:CountdownLatch,CyclicBarrir,信号量
3.线程创建线程有几种方式:这个时候应该毫不犹豫的回答1种 。面试官会有些惊讶于你的回答,因为似乎他已经习惯了听到Thread和Runnable2种方式的“标准答案” 。其实,仔细审题会发现,java创建线程只有一种方式:Thread 。Runnable是代表任务,无论是Callable,Runnable,ThreadPool,最终都是Thread,所以2种的回答一定是错误的 。另外本人整理收藏了20年多家公司面试知识点整理 共127页的PDF 以及各种知识点整理 免费分享给大家,想要资料的话私信我PDF自行领取,或者查看评论有领取资料方式 。
自己总结 给初中级JAVA准备的面试题,致竞争激烈的秋招面试

文章插图
 
4.设计模式如经典的单例模式 。当被问到单例模式时,私以为在有准备的前提下,回答使用双检锁的方式实现可以很好地诱导面试官 。双检锁实现线程安全的单例模式有两块注意点:1锁的粒度问题 2 静态变量需要被volatile修饰 。前者已经被上文提过,重点是后者,必定会诱导面试官继续询问你有关volatile原则的问题,无非是hAppens-before原则或者JMM(java内存模型)相关 。前者只需要熟记几条关键性的原则即可,而后者回答的重点便是需要提到主存与工作内存的关系 。工厂模式,观察者模式,模板方法模式,策略模式,职责链模式等等,通常会结合Spring和UML类图提问 。
5.JVM相关说实话,我自己对JVM的掌握几乎完全来自于《深入理解java虚拟机》,加上一点点线上的经验 。初级岗位常问的问题也是固定的那么几个 。内存分区:主要就是堆和栈,严谨点回答可以答方法区,虚拟机栈,本地方法栈,堆,程序计数器 。聊一聊Hotspot在jdk1.7中将常量池移到了堆中,jdk1.8移除永久代用MetaSpace代替起码可以佐证:你喜欢在一些JAVA群里面吹水 。垃圾回收算法:新生代由于对象朝生夕死使用标记-清除(or标记-整理)算法,老年代生命力强使用复制算法 。提到一句分代收集即可 。垃圾回收器一两个名字还是得叫的上来:Serial,Parallel,CMS,G1…如何判断一个对象可以被回收:引用计数(可以提到Netty中的使用案例),可达性分析(JVM使用)


推荐阅读