Java面试题及答案整理汇总(2024最新版)

1、Java中的静态变量和实例变量有何区别?静态方法和实例方法有何区别?

静态变量和实例变量的区别:
静态变量属于类,实例变量属于对象;
静态变量只有一份,被所有对象共享,实例变量每个对象都有一份;
静态变量可以直接通过类名访问,实例变量需要通过对象名访问;

静态方法和实例方法的区别:
静态方法属于类,实例方法属于对象;
静态方法可以直接通过类名调用,实例方法需要通过对象名调用;
静态方法中不能使用 this 关键字,因为 this 表示当前对象,而静态方法没有对象;

静态对象和实例对象在存储方式上也是不同的
静态变量存储在方法区(Method Area)中,也称为永久代(PermGen),即在类加载时就已经被分配了内存空间,所有该类的对象共享同一份静态变量的内存空间。
而实例变量则存储在 Java 堆(Java Heap)中,即每个对象都有自己的实例变量的内存空间,当对象被创建时,实例变量也随之被分配内存空间。
需要注意的是,从 JDK 8 开始,永久代被移除了,取而代之的是元空间(Metaspace),静态变量的存储方式也变成了存储在元空间中。但是,与永久代不同,元空间并不是虚拟机运行时数据区域的一部分,而是使用本地内存来实现的。

2、Java中如何进行对象的序列化(Serialization)和反序列化(Deserialization)?

对象的序列化(Serialization)是指将对象转换为字节流的过程,而反序列化(Deserialization)则是指将字节流转换为对象的过程。通过序列化和反序列化,可以实现对象的持久化存储、网络传输等功能。
实现 Serializable 接口:要使一个类可序列化,需要让该类实现 Serializable 接口。Serializable 接口是一个标记接口,没有定义任何方法,只是作为标记告诉编译器这个类可以被序列化。
序列化:使用 ObjectOutputStream 将对象序列化为字节流,并将字节流写入文件或发送给网络。
进行反序列化:使用 ObjectInputStream 从字节流中读取数据,并将其反序列化为对象。

异常

java异常分为运行时异常和编译时异常
编译时异常是可以被手动处理掉的,大部分是可以预见性的异常,如果是提前知道怎么处理异常,则可以使用try…cache捕获并处理异常,如果不知道如何处理,则定义该方法是声明时抛出该异常。
运行时异常则是只有在代码运行时才发出的异常,比如类转换异常,数组下标越界异常、除数为0数学异常等,这种异常在出现时会被系统自动捕获,可以手动try…cache进行处理,或者直接交给程序自动处理。

try-catch 块:try-catch 块用于捕获和处理可能抛出异常的代码块。try 块中编写可能引发异常的代码,catch 块用于捕获并处理异常。

throws 关键字:throws 关键字用于声明方法可能抛出的异常,让调用该方法的代码去处理异常。

finally 块:finally 块用于定义无论是否发生异常都会执行的代码,通常用于释放资源或清理工作。

throw 关键字:throw 关键字用于在代码中手动抛出异常。

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

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

1、error和exception的区别

error和exception都继承于throwable类
error一般是虚拟机相关的问题,如系统崩溃,内存空间不足,方法调用栈溢出等,这种问题一旦出现,就代表这无法修复的错误,是非常严重的。
exception表示程序可处理的异常,遇见这种问题,应该尽可能的解决异常,使程序恢复运行。
exception又分为运行时异常和编译时异常,编译时异常表示语法都没用办法通过,运行时异常表示的是只有在程序运行时,才会出现的异常,比如数组下标越界,没找到类异常等。遇见异常时,尽量使用try…cache进行异常捕获并处理,保证程序的正常运行。

泛型

泛型(Generic)是一种在编译时期约束集合类接受的元素类型的机制。通过泛型,可以使代码更加通用、可重用,并提高代码的类型安全性。

使用泛型可以带来以下好处:
代码复用性:通过泛型,可以编写更通用的类和方法,适用于不同类型的数据,避免了重复编写相似的代码。
类型安全性:使用泛型可以在编译时发现类型错误,避免在运行时出现类型转换异常或其他类型相关的错误。
减少强制类型转换:使用泛型可以避免频繁进行类型转换操作,使代码更加简洁清晰。

在 Java 中,泛型主要应用于以下几个方面:
泛型类(Generic Class):定义一个泛型类可以接受任意类型的数据,例如 class MyGenericClass<T>
泛型方法(Generic Method):定义一个泛型方法可以接受任意类型的参数,例如 public <T> void myGenericMethod(T t)
泛型接口(Generic Interface):定义一个泛型接口可以让实现类指定具体的类型,例如 interface MyGenericInterface<T>
泛型通配符(Generic Wildcards):使用通配符 ? 可以表示未知类型,在一些情况下可以灵活地处理不同类型的数据。### 反射

1、什么是反射?

在程序运行状态时,都能够知道任何一个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取对象类或对象信息,并动态调用对象的方法被称为反射。

2、反射的优缺点

优点:可以在运行期间就对类或对象进行判断,动态加载,提高代码灵活度。
缺点:相当于手动操作JVM进行操作,不如JVM自动操作效率高。

3、反射机制的应用场景

在平时的项目开发过程中,很少直接使用反射,但是在框架设计、模块化开发等都是通过反射调用相对应的字节码,在spring的动态代理中就使用到了反射机制,spring就是通过读取配置文件后,通过全限定类名和反射获得对象实例。

4、通过反射获取Clazz的几种方式
  1. 使用 Class.forName 静态方法,传入类的全限定类名
  2. 通过类使用.class方法
  3. 通过实例对象的.getClass()方法获取
5、通过反射创建实例对象几种方式
  1. 首先获取类的字节码文件,其次调用clazz.newInstance()获取实例
  2. 首先获取类的字节码文件,其次获取构造方法clazz.getConstructor(),通过constroctor.newInstance()创建实例对象
6、如何通过反射获取私用属性

首先通过反射获取class对象
通过class对象获取属性 getDeclaredField(filedName)
给属性设置可以访问 field.setAccessible(true);

集合

1 、简述集合体系

在这里插入图片描述

Collection接口 和 Map接口继承于Iterator接口
set接口 和 List接口继承于Collection接口
set接口下有HashSet、TreeSet和LinkedHashSet

 - HashSet:无序,集合内元素不可重复,线程不安全
 - TreeSet:指定排序算法后可以进行排序,线程不安全
 - LinkedHashSet:有序并且保证排序,线程不安全

List接口下有ArrayLis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值