2019最新Java面试题

事实

  • 首先我们需要明白一个事实,招聘的一个很关键的因素是在给自己找未来的同事,同级别下要找比自己优秀的人,面试是一个双向选择的过程,也是一个将心比心去沟通的过程。
  • 就像我们有的人感觉自己很牛逼,但是拿不到offer,而其他的人菜的一笔,却可以拿到offer,我们称之为玄学offer,遇到这种情况大家也不要感觉到有什么不可描述的心情,一切随缘即可!

一、开场白

  • 简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容;(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬)
  • 介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的技术细节;(主要对自己做过的事情是否有清晰的描述)

一、Java基础

  • 什么是字符串常量池?
    字符串的分配,和其他的对象一样,耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM首先会检查字符串常量池。如果字符串已经存在池中,就返回池中的实例引用。如果字符串不在池中,就会实例化一个字符串并放到池中。Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突进行共享。

  • String为什么是不可变的?
    1.String类是finaly的,不允许继承
    2.成员变量value是private,final的
    3.value没有setter方法
    4.构造方法,是通过克隆的方式来构造的
    5.返回value时,通过克隆的方式返回

  • String s = new String(“xyz”);究竟产生了几个对象,从JVM角度谈谈?

     答:一个或者两个;
     
     声明:s不是对象,不是对象,不是对象,s是指针引用
     
     判断  :
     
     if("xyz"在常量池中存在){
     
             只会在堆中创建一个new String("xyz") ;一个对象
     
     } else {
     
               会现在常量池中创建一个“xyz”,然后在堆中创建一个new String("xyz");两个对象
     
     }
    
  • String拼接字符串效率低,你知道原因吗?

    1、 因为java.lang.String是final类,String相加,对象发生改变,会在堆里面重新创建新对象,这样多次相加会增大内存开销。

    2、在编写代码的过程中,考虑到字符串多次相加减,最好使用java提供的StringBuffer和StringBuilder,它的对象可变,相当于捏泥人,随便你怎么捏,它都是同一个泥人。

  • 你真的了解String的常见API吗?

  1. indexOf 用于实现检索
  2. substring获取子串位置
  3. trim去除字符串周围空白
  4. charAt 用于给出位置上的字符
  5. startsWith和endsWith用于判断是否以指定字符开头或结尾
  6. String toUpperCase() 将指定字符串全部转换为大写
    String toLowerCase() 将指定字符串全部转换为小写
  7. valueOf 用于将其他类型转换为字符串类型
  • 浅析Java中的final关键字?
    final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量),表示类不可被继承,方法不可被重写,变量不可变
  • 浅析Java中的static关键字?
  • 你对Java中的volatile关键字了解多少?
  • i++是线程安全的吗?如何解决线程安全性?
  • 从字节码角度深度解析 i++ 和 ++i 线程安全性原理?
  • 请谈谈什么是CAS?
  • 从源码角度看看ArrayList的实现原理?
  • 手写LinkedList的实现,彻底搞清楚什么是链表?
  • Java中方法参数的传递规则?
  • Java中throw和throws的区别是什么?
  • 重载和重写的区别?
  • 手写ArrayList的实现,在笔试中如何过关斩将?
  • finally语句块你踩过哪些坑?
  • 为什么重写equals方法需同时重写hashCode方法?
  • equals() 与 == 的区别?
  • StringBuffer和StringBuilder的区别,从源码角度分析?
  • 你知道HashMap的数据结构吗?
  • 为何HashMap的数组长度一定是2的次幂?
  • HashMap何时扩容以及它的扩容机制?
  • HashMap的key一般用字符串,能用其他对象吗?
  • HashMap的key和value都能为null么?如果key能为null,那么它是怎么样查找值的?
  • HashMap是线程安全的吗?如何实现线程安全?
  • 从源码角度分析HashSet实现原理?
  • HashTable与HashMap的实现原理有什么不同?
  • String方法intern() 你真的会用吗?
  • 什么是自动拆装箱?
  • String.valueOf和Integer.toString的区别?

三、Java多线程

  • 线程的生命周期包括哪几个阶段?
  • 多线程有几种实现方式?
  • 请谈谈什么是进程,什么是线程?
  • 启动线程是用start()方法还是run()方法?
  • 说说线程安全问题,什么实现线程安全,如何实现线程安全?
  • sychronized和Lock的区别?
  • sleep()和wait()的区别?
  • 深入分析ThreadLocal的实现原理?
  • 你看过AbstractQueuedSynchronizer源码阅读吗,请说说实现原理?
  • 谈谈对synchronized的偏向锁、轻量级锁、重量级锁的理解?
  • 通过三种方式实现生产者消费者模式?
  • JVM层面分析sychronized如何保证线程安全的?
  • JDK层面分析sychronized如何保证线程安全的?
  • 如何写一个线程安全的单例?
  • 通过AQS实现一个自定义的Lock?
  • ThreadLocal什么时候会出现OOM的情况?为什么?
  • 为什么wait, notify 和 notifyAll这些方法不在thread类里面?
  • 你真的理解CountDownLatch与CyclicBarrier使用场景吗?
  • 出现死锁,如何排查定位问题?
  • notify和notifyAll的区别?
  • 线程池启动线程submit和execute有什么不同?
  • SimpleDateFormat是线程安全的吗?如何解决?
  • 请谈谈ConcurrentHashmap底层实现原理?
  • 使用synchronized修饰静态方法和非静态方法有什么区别?
  • 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其方法?
  • 线程池的原理,为什么要创建线程池?创建线程池的方式?
  • 创建线程池有哪几个核心参数? 如何合理配置线程池的大小?
  • synchronized修饰的静态方法和非静态方法有什么区别?

四、Java Web

  • 什么是Servlet,Servlet生命周期方法?
  • 什么Session和Cookie,它们之间有什么联系?
  • JSP的八个隐含对象有哪些?
  • JSP的四个域对象的作用范围?
  • Post和Get请求的区别?
  • 转发和重定向有什么区别?
  • JSP自定义标签,如何实现循环打印功能?
  • Http1.0和Http1.1的区别是什么?
  • 拦截器与过滤器的区别?

五、JVM面试题

  • JVM内存区域如何划分?
  1. 方法区:保存装载的类信息(类型的常量池、字段和方法信息、方法字节码)

  2. Java堆:应用系统对象都保存在Java堆里。所有线程共享Java堆

  3. Java栈:线程私有。帧保存一个方法的局部变量(包含方法的参数和局部变量)、操作数栈(Java没有寄存器,所有的参数传递使用操作数栈)

  • JVM堆中对象是如何创建的?

  • JVM对象的结构?

  • JVM垃圾回收-如何判断对象是否是垃圾对象?

  • JVM垃圾回收算法有哪些?

  • JVM垃圾收集器有哪些?

  • JVM内存是如何分配的?

  • 从一道面试题分析类的加载过程?
    加载

    加载时类加载的第一个过程,在这个阶段,将完成一下三件事情:

    1. 通过一个类的全限定名获取该类的二进制流。

    2. 将该二进制流中的静态存储结构转化为方法去运行时数据结构。

    3. 在内存中生成该类的Class对象,作为该类的数据访问入口。

    验证

    验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:

    1. 文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.

    2. 元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。

    3. 字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。

    4. 符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。

    准备

    准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。

    解析

    该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。

    初始化

    初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。

  • JVM双亲委派机制?
    当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

  • JVM可以作为GC Root的对象有哪些?

  • 请写出几段可以导致内存溢出、内存泄漏、栈溢出的代码?

  • 哪些情况会导致Full GC?

  • 频繁GC问题或内存溢出问题,如何定位?

六、SQL性能优化

  • 数据库三范式是什么?
  • 数据库的事务、ACID及隔离级别?
  • 不考虑事务的隔离性,容易产生哪三种情况?
  • 数据库连接池原理?
  • 什么是B-Tree?
  • 什么是B+Tree?
  • MySQL数据库索引结构?
  • 什么是索引?什么条件适合建立索引?什么条件不适合建立索引?
  • 索引失效的原因有哪些?如何优化避免索引失效?
  • MySQL如何启动慢查询日志?
  • MySQL如何使用show Profile进行SQL分析?
  • 一条执行慢的SQL如何进行优化,如何通过Explain+SQL分析性能?
  • 什么是行锁、表锁、读锁、写锁,说说它们各自的特性?
  • 什么情况下行锁变表锁?
  • 什么情况下会出现间隙锁?
  • 谈谈你对MySQL的in和exists用法的理解?
  • MySQL的数据库引擎有哪些,如何确定在项目中要是用的存储引擎?
  • count(*)、count(列名)和count(1)的区别?
  • union和union all的区别?

七、Spring框架

  • Spring的IOC和AOP机制?
  • Spring中Autowired和Resource关键字的区别?
  • 依赖注入的方式有几种,各是什么?
  • Spring容器对Bean组件是如何管理的?
  • Spring容器如何创建?
  • Spring事务分类?
  • Spring事务的传播特性?
  • Spring事务的隔离级别?
  • Spring的通知类型有哪些?

八、SpringMVC框架

  • SpringMVC完整工作流程,熟读源码流程?
  • SpringMVC如何处理JSON数据?
  • SpringMVC拦截器原理,如何自定义拦截器?
  • SpringMVC如何将请求映射定位到方法上面?结合源码阐述?
  • SpringMVC常见注解有哪些?
  • SpringMVC容器和Spring容器的区别?
  • SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

九、MyBatis框架

  • MyBatis中#和$的区别?
  • MyBatis一级缓存原理以及失效情况?
  • MyBatis二级缓存的使用?
  • MyBatis拦截器原理?
  • 看过MyBatis源码吗,请说说它的工作流程?

十、Java高级部分

  • Dubbo负载均衡策略?
  • Dubbo中Zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
  • Dubbo完整的一次调用链路介绍?
  • 请说说SpringBoot自动装配原理?
  • 有用过SpringCloud吗,请说说SpringCloud和Dubbo有什么不一样?
  • 什么是WebService,如何基于WebService开发接口?
  • 谈谈项目中分布式事务应用场景?
  • 使用Redis如何实现分布式锁?
  • 请谈谈单点登录原理?
  • Tomcat如何优化?
  • 后台系统怎么防止请求重复提交?
  • Linux常见命令有哪些?
  • 请说说什么是Maven的依赖、继承以及聚合?
  • Git暂存区和工作区的区别?
  • Git如何创建、回退以及撤销版本?
  • 常见的设计模式有哪些?

十一、其他

  • 看过哪些源代码?然后会根据你说的源码问一些细节的问题?(这里主要考察面试者是否对技术有钻研的精神,还是只停留在表面,还是背了几道面经,这个对于很多有强迫症的面试官,如果你连源码都没看过,基本上是会pass掉的!)
  • 项目中遇到了哪些比较有挑战性的问题,是如何解决的;(这个很有争议,一方面是你连一个复杂的问题都解决不了,要你过来干什么,还有就是,我的能力牛逼啊,但是公司没有业务场景让我展示啊!这个就看你遇到的面试官了,祝你好运!)

你可能感兴趣的:(2019最新Java面试题)