java基础知识-面试(四)

输入输出流

  • java.io.Serializable接口?
    java序列化:java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列(字节流),将序列化对象写入文件,也可以从文件中读取出来,并且对它进行反序列化,对象的类型信息,对象的数据还有对象数据类型可以用来在内存中新建对象

简单来说:java中对象的序列化是指将一个java对象写入IO流中,于此对应的是,对象的反序列化则从IO流中恢复该java对象

整个过程都是JVM独立的,也就是说,在一个平台上序列化的对象可以在另外一个完全不同的平台上进行反序列化该对象

1.为什么需要序列化?
对象文件数据有很多不同的格式,很难统一传输和保存,所以java就出了规范,用序列化来同一解决传输的问题,序列化以后就是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的数据格式的传输或者保存,传输结束后,要想再次使用,就进行反序列化还原

在工作中用的比较多的就是:比如将内存中的类写入文件或者数据库中, 在分布式系统中进行远程调用时等等

如何实现可序列化:
类通过实现java.io.Serializable接口以启用序列化功能,未实现此接口的类将无法使其任何状态序列化胡总和反序列化
可序列化类所有子类本身都是可序列化的
序列化接口没有方法或字段,仅用于表示可序列化的语义

java中重要的类,ObjectInputStream和ObjectOutputStream是高层次的数据流,它们包含序列化和反序列化对象的方法

这里写图片描述

这里写图片描述

  • javaIO中有几种类型的流
    一个流可以理解为一个数据的序列,输入流表示从一个原读取数据,输出流表示是向一个目标写数据
    字节流:字节输入流InputStream 字节输出流:OutputStream
    字符流:字符输入流:Reader 字符输出流:Writer

这里写图片描述

什么时候用字节流,什么时候用字符流:
字节流InputStream和OutputStream两个是为字节流设计的,主要用来处理字节或二进制对象
Reader和Writer两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或者字符串

字符流处理的单元为2个字节的Unicode字符,操作字符,字符数组或字符串
字节流处理单元为1个字节,操作字节和字节数组
所以字符流是由java虚拟机将字符转化为2个字节为单位的字符而承德
所以它对多国语言支持比较好

如果是音频文件、图片、歌曲等,就用字节流九号
如果是关系到中文的文本类型,用字符流就好

这里写图片描述

字节流和字符流的区别?
1.字节流在操作室不会用到缓冲区,是直接对文件本身进行操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件
2.磁盘上所有的文件都是以字节形式存在的,而字符值在内存中才会形成,真正存储和传输数据时都是以字节为单位的,字符只是存在于内存中,所以字节流使用范围更广

  • Java中NIO和IO的主要区别?

IO和NIO的主要区别?
IO面向流,而NIO面向缓冲
IO是阻塞IO,NIO非阻塞IO
IO无选择器,NIO有选择器

  • *GC
    什么是GC:
    GC就是垃圾回收机制(垃圾回收器),GC是JVM对内存实际上就是对对象进行管理的方式,

在C、C++中,释放无用变量内存空间的事情要由程序员自己来解决,程序员要做的是应该实现所需的功能,而不是耗费大量精力在内存分配释放的

Java有了GC,就不需要程序员人工去释放内存空间,GC使得Java开发人员摆脱了一个繁琐的内存管理工作,让程序的开发更有效率

当java虚拟机觉得内存资源紧张的时候,就会自动去清理无用变量占用的内存空间,当然程序员可以在java程序中显示地使用System.gc();或者Runtime.getRuntime().gc()来通知垃圾回收程序,至于垃圾回收程序运不运性,什么时候运行,都是无法控制的

如果对象引用被置为null,垃圾收集器是否会立即释放对象所占的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的
是可被回收的, 并不是说下一个回收周期,一定要去回收,释放针对的是一段已被使用的内存
回收是垃圾收集器的一个动作,结果就是释放内存

  • java中的堆和栈介绍下

堆:(主要存放对象)
引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型),需要通过new等方式来实现
堆内存主要作用于存放运行时创建的对象

主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定

栈:(基本数据类型、对象的引用变量)
基本数据类型的变量,以及对象的引用变量,其内存分配到栈上,变量出了作用于就会被释放

栈内存的主要作用是存放基本数据类型和引用变量,栈的内存管理是先进后出
主要用来执行程序,存取速度快,大小和生命周期必须确定,缺乏灵活性

猜你喜欢

转载自blog.csdn.net/qq_19704045/article/details/81417313