Java基础面试题

一、Java基础面试题

1.什么时候需要用到序列化和反序列化呢?

只要我们将Java对象存储在磁盘里面就需要序列化,要将Java对象从磁盘转换到内存时就需要反序列化,只要我们对内存中的对象进行持久化或网络传输,这个时候都需要序列化和反序列化.

2.实现序列化和反序列化为什么要实现 Serializable 接口?

1、让对象可以被序列化

首先,必须明确的一点是,只有实现 Serializable 接口的对象才可以被序列化和反序列化。如果不实现该接口,则在进行序列化时会抛出 NotSerializableException 异常。因此,通过实现 Serializable 接口来告知 JVM 该对象可以被序列化,从而为后续操作提供保证。

2、满足 Java 序列化规范

Java 序列化和反序列化是 Java 标准库提供的一项核心功能。为了满足标准,Java 要求序列化的对象必须遵循特定的协议和规范。而 Serializable 接口则是 Java 定义的接口之一,其中定义了序列化和反序列化所需遵循的规范。如果没有实现 Serializable 接口就进行序列化和反序列化操作,代码就无法满足 Java 标准的规范。

3、对象的序列化控制

在 Java 中,一个类实现了 Serializable 接口之后,就可以使用一些关键字来控制对象的序列化方式。例如,transient 关键字表示对象中的某个字段不应该被序列化,而 static 关键字则表明该属性不参与序列化。实现 Serializable 接口的类可以利用这些关键字,来控制其内部字段的序列化方式,达到更精细化的控制效果。

4、提高性能

Java 的序列化和反序列化涉及到很多过程,包括将对象序列化成二进制流、通过网络传输、从二进制流中读取数据、还原为 Java 对象等。相对于其他语言来说,Java 的序列化和反序列化工作量较大,对于频繁进行序列化操作的系统来说,性能问题是一个非常重要的考虑因素。Serializable 接口具有轻量级和高性能的特点,通过实现 Serializable 接口可以调用默认的序列化方法以达到优化系统性能的目的。

5、其他特性

在实现 Serializable 接口的同时,Java 还提供了一些其他的特性和功能,比如版本控制、自定义序列化逻辑等。例如,Serializable 接口提供了 serialVersionUID 属性,它可以保持类定义的稳定性,即使在类发生变化时也能保证反序列化成功。同样地,自定义序列化逻辑可以帮助我们更加精确地控制对象被序列化的方式和内容。

综上所述,Java 的 Serializable 接口为实现 Java 对象序列化和反序列化提供了一种标准接口和协议规范,并且具有轻量级和高性能的特点,可以通过各种关键字进行更加精确的序列化控制。此外,它还支持版本控制和自定义序列化逻辑等其它特性,以满足用户不同的需求要求。所以当我们需要使用 Java 对象进行序列化存储或是网络传输时,就必须要实现 Serializable 接口,这也是 Java 中普遍运用的一种标准做法。

3.实现 Serializable 接口之后,为什么还要显示指定 serialVersionUID 的值?

当对同一个实体序列化反序列化时,需要serialVersionUID值一致才能成功。如果我们不显示指定serialVersionUID,在序列化时会自动生成一个serialVersionUID。当实体类改动了,反序列化时,会生成一个新serialVersionUID。这两个serialVersionUID的值肯定不一致,从而反序列化会失败。但是如果显示指定,就不会生成新serialVersionUID值了。反序列化的serialVersionUID就是原序列化的serialVersionUID。

实际开发中实体类肯定会不断迭代修改的,所以指定一个显示的serialVersionUID值,就不用担心序列化和反序列化的问题了。

下列情况可以不需要serialVersionUID:
如果你的实体类新增的属性被static修饰的,这个属性就不会被序列化。

或者实体类有个属性被transient修饰,修改transient的值也不会被影响(不会被序列化)。

4.static 属性为什么不会被序列化?

static修饰的属性不能被序列化的原因是:被static修饰的属性是所有类共享的,如果可以序列化,就会出现下面的情况,当我们序列化某个类的一个对象到某个文件后,这个文件中的对象的那个被static修饰的属性值会固定下来,当另外一个普通的的对象修改了该static属性后,我们再去反序列化那个文件中的对象,就会得到和后面的对象不同的static属性值,这显然违背了static关键字诞生的初衷。

5.transient关键字的作用?

transient 是Java的关键字,如果一个变量声明了这个值,在序列化的时候,就会将他忽略,作为一个null,0存储

你可能感兴趣的:(java,开发语言,面试,学习)