Java后端高频面试知识点汇总(3):Java基础

目录

一、为什么需要序列化与反序列化?

二、序列化实现的方式有哪些?

三、 Java的IO 流分为几种?

四、BIO、NIO、AIO的区别?

五、Java的IO流用了什么设计模式?

六、描述动态代理的几种实现方式,分别说出相应的优缺点。

七、动态代理与cglib实现的区别。

八、为什么CGlib方式可以对接口实现代理。


一、为什么需要序列化与反序列化?

简要描述:对内存中的对象进行持久化或网络传输, 这个时候都需要序列化和反序列化

深入描述:

  1. 对象序列化可以实现分布式对象。 主要应用例如:RMI(即远程调用Remote Method Invocation)要利用对象序列化运行远程主机上的服 务,就像在本地机上运行对象时一样。
  2.  java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。 可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行 对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
  3. 序列化可以将内存中的类写入文件或数据库中。 比如:将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到 内存中。也可以将类序列化为流数据进行传输。 总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例 化到内存中并保留序列化时类中的所有变量和状态。
  4. 对象、文件、数据,有许多不同的格式,很难统一传输和保存。 序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输 或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。

二、序列化实现的方式有哪些?

实现Serializable接口或者Externalizable接口。

类通过实现 java.io.Serializable 接口以启用其序列化功能。可序列化类的所有子类型本身都是 可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

三、 Java的IO 流分为几种?

  • 按照流的方向:输入流(inputStream)和输出流(outputStream) 
  • 按照实现功能分:节点流(可以从或向一个特定的地方读写数据,如 FileReader)和处理流(是对 一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写, BufferedReader)
  • 按照处理数据的单位: 字节流和字符流。分别由四个抽象类来表示(每种流包括输入和输出两种所 以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的。

 

四、BIO、NIO、AIO的区别?

  • BIO:同步并阻塞,在服务器中实现的模式为一个连接一个线程。也就是说,客户端有连接请求 的时候,服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开 销,当然这也可以通过线程池机制改善。BIO一般适用于连接数目小且固定的架构,这种方式对 于服务器资源要求比较高,而且并发局限于应用中,是JDK1.4之前的唯一选择,但好在程序直观简 单,易理解。
  • NIO:同步并非阻塞,在服务器中实现的模式为一个请求一个线程,也就是说,客户端发送的连 接请求都会注册到多路复用器上,多路复用器轮询到有连接IO请求时才会启动一个线程进行处理。 NIO一般适用于连接数目多且连接比较短(轻操作)的架构,并发局限于应用中,编程比较复 杂,从JDK1.4开始支持。
  • AIO:异步并非阻塞,在服务器中实现的模式为一个有效请求一个线程,也就是说,客户端的IO 请求都是通过操作系统先完成之后,再通知服务器应用去启动线程进行处理。AIO一般适用于连接 数目多且连接比较长(重操作)的架构,充分调用操作系统参与并发操作,编程比较复杂,从 JDK1.7开始支持。

五、Java的IO流用了什么设计模式?

java IO流的设计是基于装饰者模式&适配模式,面对IO流庞大的包装类体系,核心是要抓住其功能所对 应的装饰类。

装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的 一个替代方案。装饰模式通过创建一个包装对象,也就是装饰,来包裹真实的对象。装饰模式以对客户 端透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后 有什么不同。装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。装饰模式把客户端的 调用委派到被装饰类。装饰模式的关键在于这种扩展是完全透明的。

例如,InputStream就是装饰者模式中的超类,ByteArrayInputStream,FileInputStream相当于被装 饰者,FilterInputStream就是装饰者。

六、描述动态代理的几种实现方式,分别说出相应的优缺点。

动态代理有两种实现方式,分别是:jdk动态代理和cglib动态代理。

  •  jdk动态代理的前提是目标类必须实现一个接口,代理对象跟目标类实现一个接口。
  •  cglib动态类是继承并重写了目标类(enhancer.create()方法返回的就是一个继承目标类的子类),所以目标类和方法不能被声明为final。

CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。

七、动态代理与cglib实现的区别。

  • JDK动态代理是通过接口中的方法名,在动态生成的代理类中调用业务实现类的同名方法;
  • CGlib动态代理是通过继承业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理;

八、为什么CGlib方式可以对接口实现代理。

cglib动态代理是继承并重写目标类,所以目标类和方法不能被声明为final。而接口时可以被继承的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值