专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 J给Java程序员准备的中级Java面试题

J给Java程序员准备的中级Java面试题

更新时间:2019-08-11 09:00:00 来源:动力节点 浏览2356次

如何学习计算机编程,快速学成就业.jpg

  HashMap相关


  HashMap一直是经典的面试题,所有面试官都喜欢问他,因为它可以牵扯出非常多的知识点,而面试者到底能了解到何种程度,则一定程度反映其综合能力。


  细节聊扩容因子LoadFactor=0.75,初始大小InitailCapacity=16


  纵向聊其底层实现,数据结构是数组+链表,提到jdk1.8之后对链表节点到达8之后转换为红黑树加分。继续追问的话便是引申出常用的数据结构:队列,栈,树,图。


  横向聊线程安全,HashMap为线程不安全,一般问多线程操作会导致其死循环的原因。与线程安全的ConcurrentHashMap对比,又扩展到ConcurrentHashMap的实现。继续追问的话便是引申出线程安全的定义,问一些常用的并发容器,考察面试者对java.util.concurrent包的掌握情况。那么至少可以牵扯出如下的问题:


  ConcurrentHashMap相关


  面试者可以先说历史,1.8之前采用分段锁,核心就是一句话:尽量降低同步锁的粒度。1.8之后使用CAS思想代替冗杂的分段锁实现。不出意料,面试者答出CAS之后必定会被追问其思想以及应用,换做我自己的话会有如下思路作答:CAS采用乐观锁思想达到lockfree,提一下sun.misc.Unsafe中的native方法,至于CAS的其他应用可以聊一聊Atomic原子类和一些无锁并发框架(如Amino),提到ABA问题加分。


  线程安全与锁


  线程安全这个词也是面试的高频词,说完上面的并发容器,回头说一说线程安全的定义,按照周志明大大的话回答私以为是极好的:


  当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替进行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么称这个类是线程安全的


  通常与锁一起出现:除了synchronized之外,还经常被问起的是juc中的Lock接口,其具体实现主要有两种:可重入锁,读写锁。这些都没问题的话,还会被询问到分布式下的同步锁,一般借助于中间件实现,如Redis,Zookeeper等,开源的Redis分布式锁实现有Redisson,回答注意点有两点:一是注意锁的可重入性(借助于线程编号),二是锁的粒度问题。除此之外就是一些juc的常用工具类如:CountdownLatch,CyclicBarrir,信号量


  线程


  创建线程有几种方式:这个时候应该毫不犹豫的回答1种。面试官会有些惊讶于你的回答,因为似乎他已经习惯了听到Thread和Runnable2种方式的“标准答案”。其实,仔细审题会发现,java创建线程只有一种方式:Thread。Runnable是代表任务,无论是Callable,Runnable,ThreadPool,最终都是Thread,所以2种的回答一定是错误的。


  设计模式


  如经典的单例模式。当被问到单例模式时,私以为在有准备的前提下,回答使用双检锁的方式实现可以很好地诱导面试官。双检锁实现线程安全的单例模式有两块注意点:1锁的粒度问题2静态变量需要被volatile修饰。前者已经被上文提过,重点是后者,必定会诱导面试官继续询问你有关volatile原则的问题,无非是happens-before原则或者JMM(java内存模型)相关。前者只需要熟记几条关键性的原则即可,而后者回答的重点便是需要提到主存与工作内存的关系。


  工厂模式,观察者模式,模板方法模式,策略模式,职责链模式等等,通常会结合Spring和UML类图提问。


  JVM相关


  说实话,我自己对JVM的掌握几乎完全来自于《深入理解java虚拟机》,加上一点点线上的经验。初级岗位常问的问题也是固定的那么几个。


  内存分区:主要就是堆和栈,严谨点回答可以答方法区,虚拟机栈,本地方法栈,堆,程序计数器。聊一聊Hotspot在jdk1.7中将常量池移到了堆中,jdk1.8移除永久代用MetaSpace代替起码可以佐证:你喜欢在一些JAVA群里面吹水。


  垃圾回收算法:新生代由于对象朝生夕死使用标记-清除(or标记-整理)算法,老年代生命力强使用复制算法。提到一句分代收集即可。


  垃圾回收器一两个名字还是得叫的上来:Serial,Parallel,CMS,G1...


  如何判断一个对象可以被回收:引用计数(可以提到Netty中的使用案例),可达性分析(JVM使用)


  IO相关


  bio,nio区别要熟知,了解nio中的ByteBuffer,Selector,Channel可以帮助面试者度过不少难关。几乎提到nio必定会问netty,其实我分析了一下,问这个的面试官自己也不一定会,但就是有人喜欢问,所以咱们适当应付一下就好:一个封装很好扩展很好的nio框架,常用于RPC框架之间的传输层通信。


  反射


  聊一聊你对Java中反射的理解:运行时操作一个类的神器,可以获取构造器,方法,成员变量,参数化类型...使用案例如Hibernate,BeanUtils。


  动态代理


  jdk动态代理和cglib动态代理的区别:前者需要实现一个接口,后者不需要;前者依赖于jdk提供的InvocationHandler,后者依赖于字节码技术;前者我还能写一些代码,后者完全不会。大概就这些差别了。


  2开源框架


  Tomcat


  我没看过源码,除了老生常谈的双亲委托类加载机制,似乎只能问一些相关参数了。


  Spring


  比较烦的一件事便是:当我还没问全:“聊一聊你对Spring的理解”这句话时,部分面试者的脸上已经浮现出了笑容,并迫不及待的回答:AOP和IOC。这本无可厚非,但一旦这成了条件反射式的回答,便违背了面试的初衷。


  在面试中,Spring从狭义上可以被理解成SpringFramework&SpringMVC。而广义上包含了Spring众多的开源项目,如果面试者连spring.io都没有访问过,私以为是不应该的扣分项。


  Spring常见的问题包括:SpringBean的scope取值,BeanFactory的地位,@Transactionl相关(传播机制和隔离级别),SpringMVC工作流程


  SpringBoot


  SpringBoot是当今最火的框架之一了,其starter模块自动配置的思想是面试中经常被问到的。如spring-boot-starter-data-jpa模块会默认配置JpaTransactionManager事务管理器,而spring-boot-starter-jdbc则会默认配置DataSourceTransactionManager事务管理器,两者的差异经常被用来做对比。@ConditionalOnMissingBean,@ConditionalOnBean等注解作用也需要被掌握。


  JPA&Hibernate


  ORM的思想


  懒加载如何配置以及意义


  级联如何配置,什么时候应该使用级联


  一级缓存:Session级别的缓存


  @Version的使用:数据库的乐观锁


  数据库


  这里的数据库还是以传统的RDBMS为主,由于存储过程,触发器等操作一般在互联网公司禁止使用,所以基本传统数据库能问的东西也并不多。


  1.索引的分类有哪些?面试者可以尝试自己分类回答。索引和唯一索引;聚集索引和非聚集索引;数据结构可以分为Hash和B+树索引;单列索引和联合索引。常见的索引问题还包括(A,B,C)的联合索引,查询(B,C)时会不会走索引等一些数据库的小细节。


  2.事务ACID的描述和隔离级别。


  3.mysql的explain查询分析也是面试的重点对象,一条分析结果的查询时间,影响行数,走了哪些索引都是分析的依据。


  4.如果面试官问到存储引擎,说实话也有点为了面试而面试的感觉,掌握基本的InnoDB和Myisam的区别即可。


  5.互联网公司可能会比较关心面试者对分库分表的掌握:mysql自带的sharding为什么一般不使用?中间件级别和驱动级别的分库分表,sharding-jdbc,cobar,mycat等开源组件的使用,分布式ID和分库键的选择也备受面试官的青睐。


  SpringCloud


  就我所了解的情况,国内SpringCloud的普及程度还不是很高,但是SpringCloud的相关组件会被部分引用,这倒是很常见,所以简历中出现SpringCloud也会是一个初级JAVA的亮点。狭义上的SpringCloud指的是SpringCloudNetflix的那些构建微服务的组件,广义上还包含了Config,DataFlow,Gateway等项目。


  1.Feign,Ribbon,Eureka,Zuul的使用。了解各个组件的作用,会问一些常遇到的问题如Feign的重试机制,Eureka的保护机制,Zuul的路由机制等。


  2.SpringCloud使用的restfulhttp通信与RPC通信的对比。毕竟...这是一个经久不衰的辩题,可以从耦合性,通信性能,异构系统的互信等角度对比。


  本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。同时动力节点经过多年的也收集了一套完整的面试学习资料,感兴趣的同学,可以登录动力节点IT培训官网咨询在线客服老师。

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

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