Java基础部分面试题(2025最新)

一、Java概述

1. 谈谈你对 Java 平台的理解?

① 平台无关性(一次编译到处运行)

② GC(垃圾自动回收机制,不像C++那样需要手动去释放堆内存)

③ 语言特性(泛型、反射、Lambda 表达式)

④ 面向对象(封装、继承、多态)

⑤ 类库(集合、并发库、网络库等、IO、NIO)

⑥ 异常处理


2. JDK、JRE和JVM的关系?

JDK:Java开发工具包,包含JRE、编译工具和打包工具

JRE:Java运行环境,包含JVM和和核心类库

JVM:Java虚拟机,是实现跨平台的核心部分


3. 什么是跨平台性?原理是什么?

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:Java程序是通过虚拟机在系统平台上运行的,只要该系统安装相应的java虚拟机,该系统就可以运行java程序。


4. 什么是字节码?采用字节码的最大好处是什么?

字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件)

采用字节码的好处

① 解决了传统解释型语言执行效率低的问题

② 又保留了解释型语言可移植的特点

③ 在多种不同的计算机上运行。


二、基础语法

1. Java有哪些数据类型?

① 数据类型组成:

② 各种数据类型所占的位数:

  备注:java底层没有boolean类型,都是用int代替,boolean类型占了单独使用是4个字节,在数组中是1个字节


2. Java自动装箱与拆箱?

装箱:基本数据类型转换为包装器类型valueOf

拆箱:包装器类型转换为基本数据类型intValue


3. 基本数据类型和包装类的区别?

① 包装类是对象:拥有方法和字段,对象的调用都是通过引用对象的地址,基本数据类型不是

② 包装类型是引用的传递,基本类型是值的传递

③ 声明方式不同:基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分配内存空间

④ 存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用它们

⑤ 初始值不同,eg:int的初始值为0、boolean的初始值为fales ,而包装类型的初始值为null

⑥ 使用方法不同,基本数据类型直接赋值使用就好,而包装类型是在集合如collction Map时会使用(例如List<Integer>)


4. Integer、new Integer() 和 int 比较问题?

① 两个 new Integer() 变量比较 ,永远是 false,因为new生成的是两个对象,其内存地址不同

② Integer变量 和 new Integer() 变量比较 ,永远为 false,因为 Integer变量 指向的是 java 常量池 中的对象,而 new Integer() 的变量指向 堆中 新建的对象,两者在内存中的地址不同

③ 两个Integer 变量比较,如果两个变量的值在区间-128到127 之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为 false 因为java对于-128到127之间的数,会进行缓存。

   int 变量 与 Integer、 new Integer() 比较时,只要两个的值是相等,则为true, 因为包装类Integer 和 基本数据类型int 比较时,java会自动拆包装为int ,然后进行比较,实际上就变为两个int变量的比较。


5. 访问修饰符 public,private,protected,以及不写(默认)时的区别?

6. &和&&的区别

相同点:运算符的两边都是true的时候,结果才是true;

不同点:&是两边都会运算,然后来判断结果;&&从左边找,到一个为false直接返回false

注意:&运算符有两种用法:

           ① 按位与:按位与运用二进制进行计算

           ② 逻辑与:逻辑与比较符号两边的真假输出逻辑值

拓展:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。


7. final finally finalize区别

① final是一个修饰符关键字,可以修饰类、方法、变量,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值

② finally是一个异常处理的关键字,一般作用在try-catch-finally代码块中,在处理异常的时候,通常我们将一定要执行的代码放在finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码

③ finalize属于Object类的一个方法该方法一般由垃圾回收器来调用,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9 被标记为 deprecated。


8. break ,continue ,return 的区别及作用?

break 结束当前的循环体

continue 跳出本次循环,继续执行下次循环

return 结束当前的方法,直接返回


三、面向对象

1. 面向对象和面向过程的区别

面向过程:具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现,性能比面向对象好,一般用于单片机、嵌入式开发方面开发

面向对象:抽象化的,模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,我们可以不用太关心,会用就可以了,面向对象有封装、继承、多态性的特性,所以易维护、易复用、易扩展但性能上比面向过程差

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取


2. 面向对象三大特性

封装:封装是把一个对象的属性私有化,同时提供一些可以被外界访问属性的方法

继承:子类继承父类、子类拥有父类的所有属性。

多态性:多态有三个必要条件:继承、重写、向上转型。


3. 抽象类和接口的对比

从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

相同点

① 接口和抽象类都不能实例化

② 都位于继承的顶端,用于被其他类实现或继承

③ 都包含抽象方法,其子类都必须重写这些抽象方法

不同点

注:Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。


4. 成员变量与局部变量的区别有哪些


5. 重载(Overload)和重写(Override)的区别?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分

重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。


6. == 和 equals 的区别是什么

== : 它的作用是判断两个对象的内存地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)

equals() : 它的作用也是判断两个对象是否相等。有两种使用情况:

情况1:类没有覆盖 equals() 方法,等价于通过“==”比较这两个对象。

情况2:类覆盖了 equals() 方法。一般我们都覆盖 equals() 方法来判断两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。


7. hashCode 与 equals

hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int类型的整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object类中,这就意味着Java中的任何类都包含有hashCode()函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

为什么要有 hashCode

我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相同的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。

先进行 hashcode 比较,后进行 equals 方法比较的目的:可以大大减少了 equals 方法比较的次数,相应就大大提高了执行速度。

hashCode()与equals()的相关规定

如果两个对象相等,则hashcode一定也是相同的

两个对象相等,对两个对象分别调用equals方法都返回true

两个对象有相同的hashcode值,它们不一定是相等的

因此,当重写equals方法后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。


8. 值传递和引用传递有什么区别

值传递:调用函数时将实际参数复制一份传递到函数中,函数内部对参数内部进行修改不会影响到实际参数,即创建副本,不会影响原生对象

引用传递 方法接收的是实际参数所引用的地址,不会创建副本,对形参的修改将影响到实参,即不创建副本,会影响原生对象


四、异常

1. 什么是异常?请描述一下Java异常架构

 Java异常是Java提供的一种识别及响应错误的一致性机制。异常能清晰的回答what, where, why这3个问题:

异常类型回答了“什么”被抛出,

异常堆栈跟踪回答了“在哪”抛出,

异常信息回答了“为什么”会抛出。


2. Error 和 Exception 区别是什么?

Error:表示系统级的错误和程序不必处理的异常,例如系统崩溃、内存溢出、jvm错误

Exception:表示需要捕捉或者需要程序进行处理的异常,


3. 什么是运行时异常,编译时异常?什么是受检异常与非受检异常

运行时异常(非受检异常):RuntimeException 类及其子类,Java 编译器不会检查它,此类异常一般是由程序逻辑错误引起的,需要通过修改代码来进行避免

编译时异常(受检异常):Exception 中除 RuntimeException 及其子类之外的异常,Java 编译器会检查它,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译



4. JVM 是如何处理异常的?

在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给 JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给 JVM 的过程称为抛出异常。可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。

JVM 会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。如果 JVM 没有找到可以处理该异常的代码块,JVM 就会将该异常转交给默认的异常处理器(默认处理器为 JVM 的一部分),默认异常处理器打印出异常信息并终止应用程序。

 篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取


5. 从性能角度来审视一下 Java 的异常处理机制

try-catch 代码段会产生额外的性能开销,或者换个角度说,它往往会影响 JVM 对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的 try 包住整段的代码;

利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句(if/else、switch)要低效;

Java 每实例化一个 Exception,都会对当时的堆栈进行快照,这是一个相对比较重的操作。如果发生的非常频繁,这个开销可就不能被忽略了。


6. throw 和 throws 的区别是什么?

throw:运用于方法内部,用于给调用者返回一个异常对象,和renturn一样结束当前方法

throws:运用于方法声明之上,用于表示当前方法不处理异常,而是提示该方法的调用者处理异常


7. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

其实return与finally并没有明显的谁强谁弱。在执行时,是return语句先把返回值写入但内存中,然后停下来等待finally语句块执行完,return再执行后面的一段

例子:如果fun1的finally加上return输出就是20,因为重新放到内存里,而fun2本身是操作内存,因为s是引用类型

 
  1. public int fun1() {

  2. int i = 10;

  3. try { return i; } catch (Exception e) { return i; } finally { i = 20;  }

  4. }  // 10

  5. public StringBuilder fun2() {

  6.  StringBuilder s = new StringBuilder("1");

  7.           try {

  8. s.append("2"); return s; }

  9. catch (Exception e) {

  10. return s;

  11. } finally {

  12. s.append("3");

  13. }

  14. }  // 123

8. Java常见异常有哪些

① Error

          java.lang.OutOfMemoryError(内存不足错误)

          java.lang.StackOverflowError(堆栈溢出错误)

② Exception(编译异常)

          NoSuchMethodException(方法未找到异常)

          IOException(输入输出异常)

          EOFException(文件已结束异常)

          FileNotFoundException(文件未找到异常)

          NumberFormatException(字符串转换为数字异常)

          SQLException(操作数据库异常)

③ RuntimeException(运行时异常)

         ConcurrentModificationException(并发修改异常)

          NullPointerException(空指针异常)

          ClassCastException(类转换异常)

          IndexOutOfBoundsException(索引越界异常)

          ClassNotFoundException(类文件未找到异常)

          ArithmeticException(数学计算异常)


 篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值