,刷完这套就够了)
前言就目前国内的面试模式来讲在面试前积极的准备面试复习整个 Java 知识体系将变得非常重要可以很负责任的说一句复习准备的是否充分将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系或者有的小伙伴可能都不知道该从哪里开始复习。面试如果不准备充分的面试完全是浪费时间更是对自己的不负责。Java 面试的重点数据结构与算法JVM 内存结构、垃圾回收器、回收算法、GC、并发编程相关(多线程、线程池等)、NIO/BIO、性能优化、设计模式、Spring 框架分布式相关Redis 缓存、一致 Hash 算法、分布式存储、负载均衡等微服务以及 Docker 容器等。因为头条篇幅原因不能给大家一个全面的解析末尾小编会分享一个 Java 基础到架构面试文档希望能帮助到正在努力的朋友。JVM 解析1、垃圾回收的优点和原理。并考虑 2 种回收机制。Java 语言中-一个显著的特点就是引入了垃圾回收机制使 C程序员最头疼的内存管理的问题迎刃而解它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制Java 中的对象不再有“作用域”的概念只有对象的引用才有作用域”。垃圾回收可以有效的防止内存泄露有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。2、什么是类加载器类加载器有哪些?实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。主要有一下四种类加载器:启动类加载器(BootstrapClassL oader)用来加载 Java 核心类库无法被 Java 程序直接引用。扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。系统类加载器(system class loader):它根据 Java 应用的类路径(CL ASSPATH)来加载 Java 类。-般来说Java 应用的类都是由它来完成加载的。可以通过 Classl oader.getSystemClassl _oader()来获取它。用户自定义类加载器通过继承 java.lang.ClassL oader 类的方式实现。3、java 内存分配寄存器:我们无法控制。静态域:| static 定义的静态成员。常量池:编译时被确定并保存在. class 文件中的(final) 常量值和-些文本修饰的符号引用(类和接口的全限定名字段的名称和描述符,方法和名称和描述符)。非 RAM 存储:硬盘等永久存储空间。堆内存: new 创建的对象和数组由 Java 虚拟机自动垃圾回收器管理存取速度慢。栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址)速度快可以共享但是大小与生存期必须确定缺乏灵活性。1.Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Genspace) ?JVM 的堆是运行时数据区所有类的实例和数组都是在堆上分配内存。它在 JVM 启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。-直到垃圾收集器把这些对象回收掉之前他们会一直 占据堆内存空间。更多解析Spring 解析1、怎样用注解的方式配置 Spring?Spring 在 2.5 版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代 XML 方式的 bean 描述可以将 bean 描述转移到组件类的内部只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在 XML 注入之前被处理所以后者会覆盖掉前者对于同-个属性的处理结果。注解装配在 Spring 中是默认关闭的。所以需要在 Spring 文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话请参考如下的配置。在context:annotation-conf ig/标签配置完成以后就可以用注解的方式在 Spring 中向属性、方法和构造方法中自动装配变量。下面是几种比较重要的注解类型:Required:该注解应用于设值方法。Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。Qulfier:该注解和 Autowired 注解搭配使用用于消除特定 bean 自动装配的歧义。JSR. 250 Annotations:Spring 支持基于 JSR-250 注解的以下注解,Resource、PostConstruct 和 PreDestroy。更多解析分布式解析1、四种类型的 znode1、| PERSISTENT- 持久化目录节点客户端与 zookeeper 断开连接后该节点依旧存在2、| PERSISTENT SEQUENTIAL-持久化顺序编号目录节点客户端与 zookeeper 断开连接后该节点依旧存在只是 Zookeeper 给该节点名称进行顺序编号3、1 EPHEMERAL- 临时目录节点客户端与 zookeeper 断开连接后该节点被删除4、EPHEMERAL SEQUENTIAL-临时顺序编号目录节点.客户端与 zookeeper 断开连接后该节点被删除只是 Zookeeper 给该节点名称进行顺序编号2、获取分布式流程在获取分布式锁的时候在 locker 节点下创建临时顺序节点释放锁的时候删除该临时节点。客户端调用 createNode 方法在 locker 下创建临时顺序节点然后调用 gethildren(locker)来获取 locker 下面的所有子节点注意此时不用设置任何 Watcher。客户端获取到所有的子节点 path 之后如果发现自己创建的节点在所有创建的子节点序号最小那么就认为该客户端获取到了锁。如果发现自己创建的节点并非 locker 所有子节点中最小的说明自己还没有获取到锁此时客户端需要找到比自己小的那个节点然后对其调用 exist()方法同时对其注册事件监听器。之后让这个被关注的节点删除则客户端的 Watcher 会收到相应通知此时再次判断自己创建的节点是否是 locker 子节点中序号最小的如果是则获取到了锁如果不是则重复以上步骤继续获取到比自己小的一一个节点并注册监听。当前这个过程中还需要许多的逻辑判断。更多 解析解析 tomcat文章资料都整理在一个文档里面了近 500 道面试题免费获取需要的小伙伴可以在文末获取1、tomcat 中如何禁止列目录下的文件在{tomcat_ home}/ conf/web. xml 中把 listings 参 数设置成 false 即可如下:2、Tomcat 有几种部署方式 tomcat 中四种部署项目方法第一种方法:在 tomcat 中的 conf 目录中在 server. xml 中的host/ 节点中添加:至于 Context 节点属性可详细见相关文档。第二种方法:将 web 项目文件件拷贝到 webapps 目录中。第三种方法:很灵活在 conf 目录中新建 Catalina (注意大小写)\| locathost 目录在该目录中新建一一个 xml 文件 名字可以随意取只要和当前文件中的文件名不重复就行了该 xml 文件的内容为:第 3 个方法有个优点可以定义别名。服务器端运行的项目名称为 path外部访问的 URL 则使用 XML 的文件名。这个方法很方便的隐藏了项目的名称对一些项目名称被固定不能更换但外部访问时又想换个路径非常有效。第 2、3 还有优点可以定义一些个性配置如数据源的配置等。第四种办法:可以用 tomcat 在线后台管理器-般 tomcat 都打开了直接上传 war 就可以更多解析MyBatis 解析1、Mybatis 是如何进行分页的?分页插件的原理是什么?Mybatis 使用 RowBounds 对象进行分页也可以直接编写 sql 现分页,也可以使用 Mybatis 的分页插件。分页插件的原理:实现 Mybatis 提供的接口实现自定义插件在插件的拦截方法内拦截待执行的 sql,然后重写 sql。举例:拦截 sql 后重写为;2、MyBatis 的好处是什么?MyBatis 把 sql 语句从 Java 源程序中独立出来放在单独的 XML 文件中编写给程序的维护带来了很大便利。MyBatis 封装了底层 JDBC API 的调用细节并能自动将结果集转换成 Java Bean 对象大大简化了 Java 数据库编程的重复工作。因为 MyBatis 需要程序员自己去编写 sql 语句程序员可以结合数据库自身的特点灵活控制 sql 语句因此能够实现比 Hibernate 等全自动 orm 框架更高的查询效率能够完成复杂查询。更多解析最后需要的小伙伴可以点击下方名片、免费获取这个 500 面试题的 PDF 资料哟还有更多资料包含 SpringMyBatisNetty 源码分析高并发、高性能、分布式、微服务架构的原理JVM 性能优化这些成为架构师必备的知识体系。相信对于已经工作和遇到技术瓶颈的码友在这里会有你需要的内容。