Java后端开发面试笔记总结(超详细,不看后悔hh)

前言

        刚刚经历了3-4两个月的找Java实习的经历,虽然结果并不算完美(只收获几个小厂的offer),但复习准备的经历也算是收获颇丰,更加深刻的理解了Java相关的源码知识,能够静下心来研究平常不会去考虑的JVM,并发编程等知识,经历过这样的复习后能够更加认识到理论知识的重要性。

分类

Java面试题大体有如下几大类:

  • JDK源码
  • 数据库
  • JVM
  • Java并发编程
  • Spring框架
  • 计算机网络
  • 算法
  • Linux命令(个人没怎么复习,所以本文不考虑)
  • Redis(可选)
  • 消息中间件,如rabbitmq(可选)

注:一些比较基础的如java知识,面向对象,多态等概念并未列出,还有操作系统原理知识点并不常被问到,也没列出(也是由于这些知识点多采用书本的方式复习,并未整理。。)。

JDK源码

HashMap:(重点:HashMap的数组+链表+红黑树的含义,hash如何定位到对应的数组下标,put()和resize()的过程)

ArrayList、LinkedList:(源码比较简单,重点:两者内部的数据结构,以及优缺点(增删查改的性能))

String相关(相对较简单,重点:String结合字符串常量池理解,StringBuilder和StringBuffer)

包装类(以Integer为例,常作为笔试题来出。重点:Integer.valueOf() (内部缓存),Integer.stringSize())

Java代理

其他杂乱知识点

  • 深拷贝与浅拷贝以及实现深拷贝:https://blog.csdn.net/caoxiaohong1005/article/details/78704890
  • Class.forName()和ClassLoader.loadClass()区别:https://www.cnblogs.com/zabulon/p/5826610.html
  • Java NIO(开头提到的两篇文章也都值得看):https://blog.csdn.net/forezp/article/details/88414741
  • 在Java中定义一个不做事且没有参数的构造方法的作用:Java 程序在执行子类的构造方法之前,如果没有用 super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super()来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
  • HashSet如何检查重复:当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与该位置其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

数据库

本文主要介绍mysql相关知识点,以及mysql的InnoDB。引擎的数据库知识主要分为数据库原理,sql语句,数据库引擎细节,sql多为知识点多,多为实操,本文不做介绍(之前美团面试有问到)。数据库原理知识大多数数据库原理教程讲的都大同小异,数据库引擎介绍,我使用的是《MySQL技术内幕(InnoDB存储引擎)第2版》,此书讲的非常清晰易懂,强推!

JVM

关于JVM,我主要看的是周志明的深入理解Java虚拟机,基本认真看了这本书就能应付绝大多数jvm面试问题了。下边贴出整理笔记

JVM笔记:深入理解Java虚拟机 笔记

Java并发编程

Java并发编程主要考点在于锁机制,重点Lock和synchronized,另外JUC包下的类,线程池,ThreadLocal也经常会问。也有问实操(给一个场景,分析可能的并发问题,采用什么手段来解决。这个最麻烦,不是简单背书能解决)。Java并发编程推荐一本入门数据《实战Java高并发程序设计(第2版)》葛一鸣著,讲的通俗易懂,读起来很轻松,缺点也在于不够深入。可以读读下边的博客加以补充。推荐一个学习并发编程的网站(http://ifeve.com/),有许多权威并发编程文章的译文。

笔记:实战Java高并发程序设计(第2版)

ThreadLocal

volatile

  • Java内存模型(Java产生同步问题的具体原因):https://www.jianshu.com/p/15106e9c4bf3
  • 关于volatile关键字的实现细节:内存屏障:https://www.jianshu.com/p/08a0a8c984ab
  • 并发环境下指令重排引起的问题:https://www.jianshu.com/p/90429f2a2aed
  • volatile变量使用细节:可以将对volatile变量的读写理解为一个触发刷新的操作,写入volatile变量时,线程中的所有变量也都会触发写入主存。而读取volatile变量时,也同样会触发线程中所有变量从主存中重新读取。因此,应当尽量将volatile的写入操作放在最后,而将volatile的读取放在最前,这样就能连带将其他变量也进行刷新。
  • volatile变量使用前提:变量的新值写入不能依赖于变量的旧值,因为根据旧值来计算新值的过程可能出现竞态问题,多个线程同时读取变量的同一个最新值,之后变量的修改操作将会发生覆盖。

Java线程池

其他杂乱知识点

Spring框架

spring框架主要问基本概念和源码(一般问源码的并不多),Spring相关有许多附加知识点,JPA,MyBatis,Hibernate等,由于部分并未整理不做介绍。

计算机网络

计算机网络主要看书,如《计算机网络 第七版》谢希仁著。一般主要考察TCP,HTTP相关知识点。

Redis

RabbitMQ

算法

基本面试必写的算法,具体自行leetcode刷题(dfs解决一切hh)。本节只列举自己整理的可能口述的算法题

其他杂乱的知识点

伪共享和缓存行:https://www.jianshu.com/p/7f89650367b8

字节码角度分析i++和++i: https://www.jianshu.com/p/7988e646a37e

Java高并发系统的限流策略:https://blog.csdn.net/abc592328292/article/details/80295837

Java Lambda表达式实现原理:https://blog.csdn.net/jiankunking/article/details/79825928

Java8 Stream API详解:https://blog.csdn.net/justloveyou_/article/details/79562574

 

几个推荐的他人优秀的复习整理:

美团面试题:https://github.com/Snailclimb/JavaGuide/blob/master/docs/essential-content-for-interview/PreparingForInterview/%E7%BE%8E%E5%9B%A2%E9%9D%A2%E8%AF%95%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.md#21-%E4%B8%A4%E8%80%85%E7%9A%84%E5%AF%B9%E6%AF%94

常见面试题总结:https://crossoverjie.top/JCSprout/#/

JavaGuide:https://snailclimb.gitee.io/javaguide/#/

敖丙:https://github.com/AobingJava/JavaFamily

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章