Java面试突击:46道高频基础题全解析(附30+手绘原理图)

Java面试核心:从原理到实战的深度拆解与高频考点精讲

又到了一年一度的求职季,对于广大Java开发者而言,这既是机遇也是挑战。面对市场上层出不穷的“八股文”和浩如烟海的面试题,很多朋友感到无从下手,甚至陷入“背了忘,忘了背”的循环。这篇文章,我想和你聊聊如何真正理解而非机械记忆那些核心知识点。我会结合自己过去几年面试他人以及被面试的经验,用大量手绘原理图实战代码片段,帮你构建一个清晰、立体的Java知识体系。我们的目标不是覆盖所有题目,而是让你掌握那些高频且关键的问题背后的“所以然”,从而在面试中游刃有余。

1. 理解Java的基石:JVM、内存与执行引擎

要真正掌握Java,绕不开对Java虚拟机(JVM)的深入理解。这不仅是面试高频区,更是你写出高性能、稳定代码的基础。

1.1 JVM内存区域的深度剖析

很多人对JVM内存区域的认知停留在“堆、栈、方法区”这几个名词上。但面试官想听的,是你对它们为何如此设计以及如何协同工作的理解。

JVM运行时数据区主要分为线程私有和线程共享两大类。为了让你有个直观印象,我们先看下面这张结构图:

+-------------------------------------------------------------------+
|                          JVM Runtime Data Area                    |
|                                                                   |
|  +---------------------+     +--------------------------------+  |
|  |   Thread-Private    |     |        Thread-Shared           |  |
|  |                     |     |                                |  |
|  |  +---------------+  |     |  +--------------------------+  |  |
|  |  |   Program     |  |     |  |         Heap            |  |  |
|  |  |   Counter     |  |     |  |  (对象实例、数组)        |  |  |
|  |  |   Register    |  |     |  +--------------------------+  |  |
|  |  +---------------+  |     |                                |  |
|  |                     |     |  +--------------------------+  |  |
|  |  +---------------+  |     |  |      Method Area        |  |  |
|  |  |   Java        |  |     |  | (类信息、常量、静态变量)|  |  |
|  |  |   Stack       |  |     |  +--------------------------+  |  |
|  |  |  (栈帧)       |  |     |                                |  |
|  |  +---------------+  |     |  +--------------------------+  |  |
|  |                     |     |  |   Runtime Constant      |  |  |
|  |  +---------------+  |     |  |       Pool              |  |  |
|  |  |   Native      |  |     |  |   (运行时常量池)         |  |  |
|  |  |   Method      |  |     |  +--------------------------+  |  |
|  |  |   Stack       |  |     |                                |  |
|  |  +---------------+  |     +--------------------------------+  |
|  |                     |                                          |
|  +---------------------+                                          |
+-------------------------------------------------------------------+

Java虚拟机栈(Java Stack) 是线程私有的,它的生命周期与线程相同。每个方法在执行时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法从调用到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

注意:这里说的“栈”通常指的是虚拟机栈,或者说是虚拟机栈中局部变量表部分。局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型)和returnAddress类型(指向了一条字节码指令的地址)。

本地方法栈(Native Method Stack) 与虚拟机栈作用相似,区别在于虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。

堆(Heap) 是Java世界中最“大”的一块内存,也是垃圾收集器管理的主要区域。几乎所有的对象实例和数组都在这里分配内存。堆是线程共享的,因此在并发编程中需要特别注意线程安全问题。

方法区(Method Area) 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然Java虚拟机规范把它描述为堆的一个逻辑部分,但它有个别名叫做“非堆”(Non-Heap),目的是与Java堆区分开来。

运行时常量池(Runtime Constant Pool) 是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。

1.2 对象的内存布局与访问定位

理解对象在堆中是如何存储的,能帮你更好地理解垃圾回收、内存对齐等概念。一个对象在堆内存中的存储布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

区域 内容 说明
对象头 Mark Word 存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等。这部分在32位和64位虚拟机中长度分别为32bit和64bit。
类型指针 即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
实例数据 字段内容 对象真正存储的有效信息,即程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录。
对齐填充 不是必然存在,仅起占位符作用。HotSpot VM要求对象起始地址必须是8字节的整数倍,因此当对象实例数据部分没有对齐时,需要通过对齐填充来补全。

对象创建后,如何访问它?主流访问方式有两种:使用句柄直接指针

  • 句柄访问:Java堆中划分出一块内存作为句柄池,reference中存储的是对象的句柄地址,句柄中包含了对象实例数据与类型数据各自的具体地址信息。
  • 直接指针访问:reference中存储的直接就是对象地址,对象内存中需要放置访问类型数据的相关信息。

HotSpot主要使用直接指针方式,因为这种方式速度更快,节省了一次指针定位的时间开销。

1.3 垃圾回收机制:不只是“标记-清除”

谈到JVM,垃圾回收(GC)是必问话题。但别只停留在“标记-清除”、“复制”、“标记-整理”这几个名词上。面试官更想知道你如何根据应用特点选择GC策略,以及如何分析和解决实际中的GC问题

首先,要理解“垃圾”的判断依据——可达性分析算法。这个算法的基本思路是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连,则证明此对象不可能再被使用。

哪些对象可以作为GC Roots呢?

  • 在虚拟机栈(栈帧中的局部变量表)中引用的对象。
  • 在方法区中类静态属性引用的对象。
  • 在方法区中常量引用的对象。
  • 在本地方法栈中JNI引用的对象。
  • Java虚拟机内部的引用,如基本数据类型对应的Class对象、常驻的异常对象等。
  • 所有被同步锁持有的对象。
  • 反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

现代的垃圾收集器基本都是分代收集的,所以我们需要了解不同分代的特点和收集策略:

// 一个简单的示例,展示不同生命周期的对象
public class GenerationExample {
    private static final List<byte[]> STATIC_LIST = new ArrayList<>(); // 常驻方法区,被静态变量引用
    
    public void method() {
        byte[] localArray = new byte[1024 * 1024]; // 在Eden区分配,方法结束后可能被回收
        STATIC_LIST.add(localArray); // 对象被静态变量引用,晋升到老年代
        // 方法结束,localArray引用消失,但对象仍在STATIC_LIST中
    }
    
    public static void main(String[] args) {
        GenerationExample example = new GenerationExample(); // 对象在堆中分配
        for (int i = 0; i < 100; i++) {
            example.method();
            System.gc(); // 建议GC,观察对象晋升
        }
    }
}

常见的垃圾收集器组合与适用场景:

收集器组合 新生代算法 老年代算法 特点 适用场景
Serial + Serial Old 复制 标记-整理 单线程,STW时间长 客户端模式,几百MB堆内存
ParNew + CMS 复制 标记-清除 多线程并行,低停顿
Java 软件工程师面试资料大整合 1 Java 霸 1 1. int 和 Integer 有什么区别? 8 2. String 和StringBuffer的区别 8 3. 运行时异常与一般异常有何异同? 8 4. 说出ArrayList,Vector,LinkedList的存储性能和特性 8 5. EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 9 6. Collection 和 Collections的区别。 9 7. &和&&的区别。 9 8. HashMap和Hashtable的区别。 10 9. final, finally, finalize的区别。 10 10. sleep() 和 wait() 有什么区别? 10 11. Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 10 12. error和exception有什么区别? 11 13. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 11 14. 简述synchronized和java.util.concurrent.locks.Lock的异同 ? 11 15. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 11 16. abstract class和interface有什么区别? 12 17. abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 12 18. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 19. heap和stack有什么区别。 13 20. forward 和redirect的区别 13 21. EJB与JAVA BEAN的区别? 13 22. Static Nested Class 和 Inner Class的不同。 13 23. JSP中动态INCLUDE与静态INCLUDE的区别? 14 24. List, Set, Map区别 14 25. 集合类都有哪些?主要方法? 14 26. 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 14 27. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 14 28. JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 15 29. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 15 30. 构造器Constructor是否可被override 15 31. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 16 32. 应用服务器与WEB SERVER的区别? 16 33. BS与CS的联系与区别。 16 34. 启动一个线程是用run()还是start()? 17 35. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 18 36. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 18 37. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 18 38. 比较truncate和delete 命令 18 39. 解释$ORACLE_HOME 和$ORACLE_BASE的区别? 19 40. session与cookie的区别和联系? 19 41. Statement和PrepareStatement的区别 19 42. JSP的内置对象及方法。 19 43. JSP的常用指令 20 44. 四种会话跟踪技术 20 45. Request对象的主要方法: 21 46. jsp有哪些动作?作用分别是什么? 21 47. 两种跳转方式分别是什么?有什么区别? 22 48. get和post的区别? 22 49. JDK,JRE,JVM的区别? 22 50. Java中常见类,方法,接口 23 51. 多线程 23 51.1. 线程的基本概念 23 51.2. Java中的线程有四种状态 23 51.3. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 24 51.4. 线程同步的方法。 24 51.5. java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 25 52. 数据连接池 25 52.1. 连接池的基本原理: 25 52.2. 连接池的工作机制 25 52.3. 建立连接池 26 52.4. 连接池内连接的使用与释放 26 52.5. 配置连接池 26 52.6. 配置tomcat 6.0.10连接池 26 52.7. Hibernate实现数据库的连接不同方式: 28 52.8. 有几种开源的数据库连接池: 29 53. 描述一下JVM加载class文件的原理机制? 30 54. socket编程 30 54.1. 什么是TCP/IP、UDP? 30 54.2. Socket在哪里呢? 31 54.3. Socket是什么呢? 32 54.4. socket的实现步骤 37 55. Servlet 38 55.1. Servlet工作流程 38 55.2. servlet的生命周期 38 55.3. Servlet执行时一般实现哪几个方法? 38 56. 会话跟踪 39 56.1. Cookie 39 56.2. session 39 56.2.1. Session 生命周期 39 57. EJB的几种类型 39 58. 排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 40 59. 请对以下在J2EE中常用的名词进行解释(或简单描述) 40 59.1. web 容器 40 59.2. EJB容器 40 59.3. JNDI 40 59.4. JMS 41 59.5. JTA 41 59.6. JAF 41 59.7. RMI/IIOP 41 60. JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 41 61. MVC的各个部分都有那些技术来实现?如何实现? 42 62. java中实现多态的机制是什么? 42 63. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 42 63.1. 判断该对象是否是时候可以收集方法 43 63.1.1. 引用计数 43 63.1.2. 对象引用遍历 43 63.2. 几种垃圾回收机制 43 63.2.1. 标记-清除收集器 43 63.2.2. 标记-压缩收集器 43 63.2.3. 复制收集器 44 63.2.4. 增量收集器 44 63.2.5. 分代收集器 44 63.2.6. 并发收集器 44 63.2.7. 并行收集器 44 63.3. Sun HotSpot 1.4.1 JVM堆大小的调整 44 63.4. BEA JRockit JVM的使用 45 63.4.1. Bea JRockit JVM支持4种垃圾收集器: 46 63.5. 如何从JVM中获取信息来进行调整 46 63.6. Pdm系统JVM调整 47 63.6.1. 服务器:前提内存1G 单CPU 47 63.6.2. 客户机:通过在JNLP文件中设置参数来调整客户端JVM 47 64. 什么时候用assert。 47 65. 什么是java序列化,如何实现java序列化? 48 65.1. java序列化、反序列化 48 65.2. 对象的序列化主要有两种用途: 48 65.3. 对象序列化包括如下步骤: 49 65.4. 对象反序列化的步骤如下: 49 66. 反射机制 49 66.1.1. 传统的类型转换。 49 66.1.2. 通过Class对象来获取对象的类型。 49 66.1.3. 通过关键字instanceof或Class.isInstance()方法 49 67. 说出一些常用的类,包,接口,请各举5个 50 68. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 51 69. jdbc 51 69.1. 简述 51 69.2. JDBC调用数据库的基本步骤 52 69.3. JDBC URL 52 70. MVC设计模式 53 71. Hibernate 54 71.1. Hibernate 介绍 54 71.2. Hibernate 实现原理 55 71.3. Hibernate 优点 56 71.4. Hibernate 的缓存体系 56 71.4.1. 一级缓存: 56 71.4.2. 二级缓存: 56 71.4.3. 缓存管理 56 71.5. Hibernate 中Java对象的状态 58 71.5.1. 临时状态 (transient) 58 71.5.2. 持久化状态(persisted) 58 71.5.3. 游离状态(detached) 58 71.5.4. hibernate的三种状态之间如何转换 59 71.6. Hibernate并发机制,并发问的处理。 59 71.6.1. Hibernate并发机制 59 71.6.2. 并发问解决方案 59 71.7. Hibernate是如何延迟加载? 60 71.8. Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 60 71.9. 说下Hibernate的缓存机制 60 71.10. Hibernate的查询方式 60 71.11. 如何优化Hibernate? 61 71.12. Hibernate和spring中常出现的几个异常 61 71.13. Hibernate与jdbc的联系 62 71.14. Hibernate与Spring的联系 62 71.15. Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页? 62 71.16. hibernate中一对多配置文件返回的是什么? 63 71.17. hibernate拒绝连接、服务器崩溃的原因?最少写5个 63 71.18. Hibernate主键介绍 63 71.18.1. Assigned 63 71.18.2. Hilo 63 71.18.3. Increment 64 71.18.4. Identity 64 71.18.5. Sequence 64 71.18.6. Native 64 71.18.7. UUID 64 71.18.8. Foreign GUID 65 71.19. Hibernate源码中几个包的作用简要介绍 65 72. struts 66 72.1. struts 简介 66 72.2. STRUTS的应用(如STRUTS架构) 66 72.3. 请写出Struts的工作原理、工作机制 67 72.4. struts的处理流程。 67 72.5. Struts 2框架的大致处理流程如下: 68 72.6. Struts体系结构中的组件 69 72.7. struts如何实现国际化 70 72.8. struts2.0的常用标签 71 72.9. action是单实例还是多实例,为什么? 73 72.10. Struts的validate框架是如何验证的? 74 72.11. dispatchAction是用什么技术实现的? 74 72.12. struts2.0的mvc模式?与struts1.0的区别? 74 72.13. struts1.2和struts2.0的区别?如何控制两种框架中的单例模式? 74 73. Spring 75 73.1. Spring 简介 75 73.2. 为什么要用Spring? 76 73.3. spring工作机制或工作原理 76 73.4. Spring是什么?根据你的理解详细谈谈你的见解。 76 73.5. 项目中如何体现Spring中的切编程,具体说明。 77 73.6. 项目中用到的Spring中的切编程最多的地方:声明式事务管理。 77 73.7. spring的事务如何配置 77 73.8. transaction有那几种实现(事务处理)(Spring) 79 73.9. Spring IoC 79 73.10. Spring AOP向方编程 82 74. 项目中为什么使用SSH 85 75. Spring在SSH中的作用 86 76. weblogic 86 76.1. 如何给weblogic指定大小的内存? 86 76.2. 如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 86 76.3. 如何启动时不需输入用户名与密码? 86 76.4. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 86 76.5. 在weblogic中发布ejb需涉及到哪些配置文件 87 76.6. 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置 87 76.7. 如何查看在weblogic中已经发布的EJB? 87 76.8. 说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 87 77. tomcat 87 77.1. 解决端口冲突导致tomcat无法启动的问 87 77.2. 修改java虚拟机内存 88 77.3. 修改tomcat连接数 88 77.4. 禁止列出目录下的文件 88 77.5. 设置session失效的时间 89 77.6. 设置MIME响应类型 89 77.7. 设置tomcat的默认访问页 89 77.8. 设置tomcat管理用户 89 77.9. 录 90 78. websphere 90 79. 常见异常 90 79.1. nullpointerexception 90 79.2. classnotfoundexception 90 79.3. arithmeticexception 90 79.4. arrayindexoutofboundsexception 91 79.5. illegalargumentexception 91 79.6. illegalaccessexception 91 80. 异常机制 97 81. 异常的分类 97 82. 异常的使用方法 98 83. JAVA代码查错 101 83.1. 判断 101 83.2. 判断 102 83.3. 判断 102 83.4. 判断 102 83.5. 判断 102 83.6. 判断 103 83.7. 判断 103 83.8. 判断 103 83.9. 判断 104 83.10. 判断 104 83.11. 判断 105 84. 编码 106 84.1. 写出一个单例模式 106 84.2. 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 106 84.3. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问。 107 84.4. 现在输入n个数字,以逗号”,”分开;然后可选择升或者降序排序;按提交键就在另一页显示按什么排序,结果为,提供reset 108 84.5. 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 109 84.6. 内部类的实现方式? 112 84.7. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。 113 84.8. 将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七),请用java语言编一段程序实现! 114 84.9. 目1:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. 117 84.10. 写一个方法,实现字符串的反转,如:输入abc,输出cba 119 84.11. 请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 119 84.12. 请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 84.14. 列出某文件夹下的所有文件; 123 84.15. java调用系统命令实现删除文件的操作; 123 84.16. java实现从文件中一次读出一个字符的操作; 124 84.17. 列出一些控制流程的方法; 124 84.18. 编写了一个服务器端的程序实现在客户端输入字符然后在控制台上显示,直到输入"END"为止,让你写出客户端的程序; 124 84.19. 用jdom解析xml文件时如何解决中文问?如何解析? 127 84.20. Jquery ajax 实现异步 129
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值