Java 基础面试300题 (291-313)

Java 基础面试300题 (291-313)

291 . Externalizable接口和Serializable 接口有什么区别?

Serializable 接口是一个标记接口,没有定义任何方法,不必实现。Externalizable接口定义了readExternal()writeExternal()方法,必须实现这些方法。

当实现Serializable 接口时,JVM会和效率低下文件流打交通。
如果不确定如何高效执行IO流,最好使用Serializable 接口实现序列化 。如果能够高效地执行特定于应用程序的IO流,则应考虑通过实现Externalizable接口来实现序列化。

当对象的所有或大部分属性必须序列化时,使用Serializable 接口并根据需要使用瞬态变量实现序列化将更有效率。但是,如果仅仅是序列化一个具有很多属性的大型Java对象的某些动态属性 ,实现Externalizable接口是一种更好的序列化方式,因为可以在其重写方法中指定特定的序列化的内容。

292.什么是serialVersionUID

serialVersionUID 是可序列化类的唯一标识符,用来确保序列化和反序列化对象引用的是同一类版本。如果未在程序中定义,Java编译器会创建一个唯一的serialVersionUID。最好为每个可序列化的类都定义一个serialVersionUID,否则JVM在版本更改时将无法识别该类。每次更改可序列化类的属性时,如果用户没有定义,JVM都会创建一个新的serialVersionUID 。因此,最佳实践是为Java中的所有可序列化类都定义serialVersionUID

293. 列举一些类似对象序列化的技术?

Java使用对象序列化将数据永久存储在系统存储中。同样也可以使用其他方法,如数据库、XML和JSON 。使用数据库存储对象是一种非常常见的方法。可以使用ORM或对象关系映射将对象存储到数据库,然后从数据库检索。许多WebService 普遍使用基于XML的数据存储和传输, 这种方式是通过互联网传输数据的最流行方式。JSON数据传输是一种相对较新的使用很广泛的格式。JSON的实现非常简单,它基于Javascript技术,它已经集成到大多数网络浏览器中。

294.Java对象如何在JVM 的生命周期之外存在?

对象序列化允许Java对象生存超过JVM的生命周期。

295. 如何序列化一个集合, 必须让所有成员都可序列化吗?

集合或数组的所有成员都必须可序列化才能序列化。

296.如何从对象的序列化状态中排除某些变量?

要从序列化过程中排除变量,应该用transient关键字标记这些变量 。如下示例:

transient private String firsName

296 . 如果一个类实现了Serializable接口 ,但它包括一个不可序列化的对象,是否可以对这个类序列化?

对这个类的序列化将失败,运行时会抛出 java.io.NotSerializableException异常 。

297. 反序列化完成后,瞬态变量是什么值?

瞬态变量在反序列化完成后会获得默认值。

298: 通过实现Serializable接口来实现类的序列化,需要实现哪些方法?

不需要实现任何方法。 Serializable接口是一个标记接口,没有定义任何方法,因此实现它的类不需要实现任何方法。

299. 使用serialVersionUID的目的是什么?

serialVersionUID为每个可序列化的类提供版本系统。在反序列化过程中,serialVersionUID用于检查从输入流读取的数据是否与当前类定义兼容。

300.serialVersionUID是一个静态字段, 它也需要序列化吗?

serialVersionUID是一个静态字段,也与其他数据一起序列化。在反序列化期间, 反序列化的serialVersionUID必须与当前类定义中声明的serialVersionUID匹配。

301. 如果反序列化对象的serialVersionUID与类定义中声明的不匹配,会发生什么?

这种情况下,反序列化会失败,抛出java.io.InvalidClassException异常。

302.如果一个可序列化类没有定义 serialVersionUID ,编译器如何处理?

Java编译器根据类中声明的字段自动增加一个serialVersionUID

303.在哪些场景中应该使用序列化?

比如,当需要通过网络发送对象时,对象首先需要序列化,然后才能够(作为数据)发送。

304. 出现NotSerializableException的原因是什么?

如果要序列化一个类,它必须实现Serializable接口。同样重要的是,该类中包含的所有对象也是可序列化的。如果任何一个包含的对象没有实现Serializable接口,则会抛出NotSerializableException

305.如何更改默认的序列化行为?

通过重写ObjectOutputStream对象的writeObject()ObjectInputStreamreadObject()方法可以控制复杂的对象序列化过程,可以提供额外的信息来序列化和反序列化对象。

306.如果想完全控制类的序列化过程,需要实现哪个接口?

如果想完全控制类的序列化过程,应实现 java.io.Externalizable接口。

307. 实现外部序列化时要重写哪些方法?

实现Externizable接口时,应重写该接口定义的两个方法readExternalwriteExternal

308. 考虑以下情况,Child类也是可序列化的吗?

public class Parent implements Serializable
public class Child extends Parent

子类从其对象层次结构中继承了Serializable接口 ,因此也是可序列化的。

309. 反序列化时,会调用对象的构造函数,是正确的吗?

反序列化意味着恢复序列化对象,而不是重建它。在反序列化过程中没有调用构造函数。

310. 考虑如下代码,Student类是可序列化的, 它有一个 String类型的name实例变量, 因为不是基础类型,序列化会失败吗?

public class Student implements Serializable {
private String name; 
...
}

java.lang.String本身是可序列化的,因此Student类是可以序列化的类。

311. 所有基础类型的包装类都是可序列化吗?

是的。所有基础数据类型的包装类都实现了可序列化接口。

312.假设有一个可序列化类,但其超类没有实现 Serializable 接口。超类定义了无参数构造函数和字符串参数构造函数。在反序列化时,超级类的哪个构造函数将被调用?

无参数构造函数将被调用, 实现Serializable的子类应该可以访问这个构造函数。

313. 考虑以下情况,有一个可序列化类,但没有定义serialVersionUID。现在将其序列化,然后在类中添加一个新的实例变量,并将其已序列化的实例反序列化。会发生什么?

由于serialVersionUID没有在类中定义,JVM会基于类中的字段信息自动生成。一旦在类中添加或删除实例变量,JVM会重新生成serialVersionUID 。在上述场景中,当前类中的serialVersionUID和序列化的实例中的serialVersionUID不一致,因为重新增加了实例变量,因此反序例化会失败,抛出java.io.InvalidClassException异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT6.3学习技巧,快速入门

学习和掌握QT6.3的技巧和入门方法,可以让你更快速地掌握和使用这个开发工具。下面是一些建议和步骤: 学习基础知识:在开始学习QT6.3之前,建议先了解一些基础知识,例如C编程语言和图形用户界面的基本概念等。这些知识可…

如果entity中的age字段为integer类型,mybatisplus更新entity时,当age字段为null,数据不会更新,怎么办?

在使用 MyBatis-Plus 更新实体对象时,如果 age 字段为 null 并且希望将该字段更新为数据库中的 null,可以使用以下几种方法来实现: 方法1:使用 TableField(updateStrategy FieldStrategy.IGNORED) 通过在实体类中使用 TableFie…

跟着GPT学设计模式之观察者模式

你好,这里是codetrend专栏“跟着GPT学设计模式”。 引言 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其依赖对象都能够收到通…

PostgreSql常用的时间类型以及对应Java中的类型以及在Mybatis XML中转换

PGSQL DATE:用于存储日期信息,不包含任何时间信息,例如:‘2024-06-06’。 TIME:用于存储一天内的时间,精确到毫秒,例如:‘10:30:00.123’。 TIMESTAMP:用于存储日期和…

Junit(Java单元测试)

配置文件 要想使用 Junit 进行单元测试需要引入以下第三方库&#xff1a; 引入后可以使用 Test&#xff0c;BeforeEach等注解 <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter<…

eclipse添加maven插件

打开eclipse菜单 Help/Install New SoftwareWork with下拉菜单选择 2022-03 - https://download.eclipse.org/releases/2022-03‘type filter text’搜索框中输入 maven选择 M2E - Maven Integration for Eclipse一路next安装&#xff0c;重启eclipseImport项目时&#xff0c;就…

ESP8266在阿里云上线(arduino)

电脑连接上ESP8266的板子 在arduino编写代码&#xff08;arduino按照之前的配置&#xff0c;已安装好esp的开发板和几个库ArduinoJson我选了5.的版本&#xff0c;PubSubclient,Crypto,AliyunIoTSDK并且修改pubsubclient的参数&#xff09; 在项目&#xff0c;加载库&#xff0c…

Elixir学习笔记——二进制、字符串和字符列表

在“基本类型”中&#xff0c;我们学习了一些关于字符串的知识&#xff0c;并使用 is_binary/1 函数进行检查&#xff1a; iex>string "hello" "hello" iex>is_binary(string) true 在本章中&#xff0c;我们将明确二进制到底是什么、它们与字符串…

【RuoYi】如何解决Postman无法访问RuoYi中的接口数据

一、前言 最近&#xff0c;写项目要求需要将数据返回&#xff0c;指定的接口&#xff0c;并且需要使用Postman来测试接口数据&#xff0c;看是否能够请求到数据。然后项目用的是RuoYi的框架&#xff0c;RuoYi使用了SpringSecurity来做的安全框架&#xff0c;所以在访问的时候&a…

【Linux】ip命令详解

Linux网络排查 目录 一、ip命令介绍 1.1 ip命令简介 1.2 ip命令的由来 二、ip命令使用帮助 2.1 ip命令的help帮助信息 2.2 ip命令对象介绍 2.3 ip命令选项介绍 三、查看网络信息 3.1 显示当前网络接口信息 3.2 显示网络设备运行状态 3.3 显示详细设备信息 3.4 查看…

基于.NetCore和ABP.VNext的项目实战八:使用Redis缓存数据

这里将集成Redis,使用Redis来缓存数据,在appsettings.json配置Redis的连接字符串 //appsettings.json ..."Caching": {"IsOpen": "true","RedisConnectionString": "127.0.0.1:6379,ConnectTimeout=15000,SyncTimeout=5000&qu…

面向大模型的存储加速方案

参考&#xff1a;面向大模型的存储加速方案设计和实践-百度开发者中心 (baidu.com) 对于一个典型的训练来说&#xff0c;可能迭代多轮 epoch。在每个 epoch 内&#xff0c;首先需要对数据集进行随机打散&#xff0c;然后将打散后的数据划分为若干 batch&#xff0c;每读取一个 …

智谱AI最新开源模型CHATGLM4-9B试用

智谱AI最近开源了GLM4-9B模型。之前已开源chatglm1到chatglm3&#xff0c;相比前面开源的相比GLM3-6B有了大幅度提升。本次开源基本的GLM4-9B&#xff0c;还开源了对话版GLM-4-9B-Chat&#xff0c; 多模态版GLM-4V-9B&#xff0c; 长文本版GLM-4-9B-Chat-1M。 在语义、数学、推…

软件杯 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

Nginx location 配置:从入门到精通

Nginx的 location 配置是Nginx服务器配置中非常关键的一部分&#xff0c;它决定了如何响应不同的HTTP请求。以下是关于Nginx location配置的详细解释&#xff1a; 一、基本语法 location指令的基本语法如下&#xff1a; location [modifier] pattern {# 配置内容 }其中&#…

零拷贝技术

背景 磁盘可以说是计算机系统重最慢的硬件之一&#xff0c;读写速度相对内存10以上&#xff0c;所以针对优化磁盘的技术非常的多&#xff0c;比如&#xff1a;零拷贝、直接I/O、异步I/O等等&#xff0c;这些优化的目的就是为了提高系统的吞吐量&#xff0c;另外操作系统内核中的…

如何实现观察者模式和发布-订阅模式?

要实现观察者模式和发布-订阅模式&#xff0c;你需要遵循一些基本的步骤和原则。下面分别介绍这两种模式的实现方法。 如何实现观察者模式&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;用于维护观察者&#xff08;Observe…

GAT1399协议分析(8)--ImageInfo字段详解

一、官方定义 接上一章节字段消息返回内容 "ImageInfo": { "ImageID": "34078100001190001002012024060513561300065", "InfoKind": 0, "ImageSource": "…

eclipse怎么导入python项目

python项目导入eclipse的步骤&#xff1a; 1、首先&#xff0c;打开Eclipse集成开发程序&#xff0c;在菜单栏上点击“File(F)”&#xff0c;在弹出来的列表中点击“导入&#xff08;I&#xff09;...”。 2、在弹出来的“导入”窗口中&#xff0c;选择“常规”选项中的“现有…

【uni-app】开发问题汇总

文章目录 1、APP获取dom2、添加页面&#xff0c;参考其他页面&#xff0c;国际化就是对应页面的导航的国际化"navigationBarTitleText": "%m.i.ForgetPaymentPassword.bartitle%",3、setStatusBarStyle这个导航栏设置方法不要了&#xff0c;导航栏现在都用…