【面试系列】Java面试知识篇(七)

发布于:2022-12-14 ⋅ 阅读:(928) ⋅ 点赞:(0)

在这里插入图片描述
个人简介:

📦个人主页:赵四司机
🏆学习方向:JAVA后端开发
📣种一棵树最好的时间是十年前,其次是现在!
🔔博主推荐网站:牛客网 刷题|面试|找工作神器
💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

前言

由于很快到了金九银十的秋招季节,博主最近也在找一些面经资源,但是发现很多都不全,后来我发现了牛客网这个网站,发现里面不仅可以看面经,还能刷题模拟面试,要是你要找各种招聘信息也可以在上面找到,我愿称之为程序员必备网站,下面把它推荐给你们!
链接地址:牛客网

在这里插入图片描述

52.HashSet实现原理

HashSet底层是基于HashMap实现的,也是数组加链表的结构,当向HashSet中添加元素时候,首先会根据HashCode检查该位置上面是否已经存在元素,假如不存在则直接添加,否则就调用Equals方法对该位置的链表上面的元素进行一一比较,假如不相等则进行元素插入(jdk1.7插入到链表上方(头插法),jdk1.8插入到链表下方(尾插法),七上八下),假如equals方法返回true则添加失败。

53.Sleep()和wait()有什么区别

  • 同:一旦执行方法,都能使线程进入阻塞状态。
  • 异:
    • 两个方法声明的位置不同,sleep()声明在Thread中,wait()声明在Object中
    • 调用要求不同:sleep()可以在任何需要的场景下被调用,而wait()只能在同步代码块或者同步方法中被调用
    • 关于是否释放同步监视器:如果两个方法都声明在同步代码块或者同步方法中,sleep()不会释放锁,而wiat()会释放锁。

54.常用编码大小

UTF-8中英文占一个字节,中文占3个字节;Unicode英文中文都是两个字节;GBK英文一个字节,中文两个字节。

55.字节流

InputStream(字节输入流):

InputStream 常用方法 :

  • read() :返回输入流中下一个字节的数据。返回的值介于 0 到 255 之间。如果未读取任何字节,则代码返回 -1 ,表示文件结束。
  • read(byte b[ ]) : 从输入流中读取一些字节存储到数组 b 中。如果数组 b 的长度为零,则不读取。如果没有可用字节读取,返回 -1。如果有可用字节读取,则最多读取的字节数最多等于 b.length , 返回读取的字节数。这个方法等价于 read(b, 0, b.length)
  • read(byte b[], int off, int len) :在read(byte b[ ]) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字节数)。
  • skip(long n) :忽略输入流中的 n 个字节 ,返回实际忽略的字节数。
  • available() :返回输入流中可以读取的字节数。
  • close() :关闭输入流释放相关的系统资源。

从 Java 9 开始,InputStream 新增加了多个实用的方法:

  • readAllBytes() :读取输入流中的所有字节,返回字节数组。
  • readNBytes(byte[] b, int off, int len) :阻塞直到读取 len 个字节。
  • transferTo(OutputStream out) : 将所有字节从一个输入流传递到一个输出流。

FileInputStream是常用的字节输入流对象,可以指定文件路径,可以读取单字节,也可以读取至字节数组中。通常结合BufferedInputStream使用。

DataInputStream可以读取指定的数据类型,不能单独使用,必须结合FileInputStream使用。

ObjectInputStream用于从输入流中读取对象(反序列化),ObjectOutputStream用于将Java对象写入到输入流中(序列化)。

OutputStream(字节输出流):

类似InputStream

wirte(int b):将特定字节写入输入流;

flush():刷新此输入流并强制写出所有缓冲的输出字节;

字符流:

使用字节读取字符会出现中文乱码问题,字节流一般用于读取音频、图片等文件,涉及字符的文件一般用字符流读取。

Reader(字符输入流):

InputStreamReader是字节流转换成字符流的一个桥梁,其父类是Reader,而FileReader又是InputStreamReader的子类,可以直接操作字符文件。

Writer(字符输出流):

OutputStreamWriter 是字符流转换为字节流的桥梁,其子类 FileWriter是基于该基础上的封装,可以直接将字符写入到文件。

字符缓冲流:BufferedReader(字符输入缓冲流)、BufferedWriter(字符输出缓冲流)。

56.打印流

prinr实质上是调用PrintStream对象的write方法,PrintStream属于字符打印流,其父类是OutputStream;与之对应的是PrintWriter(字节打印流),其父类是Writer。

57.随机访问流

RandomAccessFile支持随机跳转到文件指定位置进行读写。

RandomAccessFile 中有一个文件指针用来表示下一个将要被写入或者读取的字节所处的位置。我们可以通过 RandomAccessFileseek(long pos) 方法来设置文件指针的偏移量(距文件开头 pos 个字节处)。如果想要获取文件指针当前的位置的话,可以使用 getFilePointer() 方法。

温馨提示:上面只是我总结的面经知识,如果你想要更全面的可以到网站自行查看喔。
友情链接:牛客网
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看