【面试题】Java基础篇-常见面试题总结p3,面试必问知识点

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • public String getMessage():返回异常发生时的简要描述

  • public String toString():返回异常发生时的详细信息

  • public String getLocalizedMessage():返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同

  • public void printStackTrace():在控制台上打印 Throwable 对象封装的异常信息

栗子:

/**

  • @author xppll

  • @date 2021/11/30 09:08

*/

public class testThrowable {

public static void main(String[] args) {

try {

int a = 10 / 0;

} catch (Exception e) {

System.out.println(“getMessage…”+e.getMessage());

System.out.println(“toString…”+e.toString());

System.out.println(“getLocalizedMessage…”+e.getLocalizedMessage());

System.out.print(“printStackTrace…”);

e.printStackTrace();

}

}

}

输出:

getMessage…/ by zero

toString…java.lang.ArithmeticException: / by zero

getLocalizedMessage…/ by zero

printStackTrace…java.lang.ArithmeticException: / by zero

at com.atguigu.mybatisplus.testThrowable.main(testThrowable.java:10)

7.说说什么是序列化?什么是反序列化?


如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。

简单来说:

  • 序列化:将数据结构或对象转换成二进制字节流的过程

  • 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程

总的来说序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Nvdaodn-1640303890481)(【面试题】Java基础篇-常见面试题总结p3.assets/a478c74d-2c48-40ae-9374-87aacf05188c.png)]

👨‍💻面试官追问:在Java序列化中如果有些字段不想进行序列化,怎么办?

对于不想进行序列化的变量,使用 transient 关键字修饰。它可以阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值也不会被持久化和恢复

例子:

创建实现Serializable接口的Person类:

/**

  • @author xppll

  • @date 2021/12/23 22:44

*/

@Data

@ToString

@AllArgsConstructor

@NoArgsConstructor

public class Person implements Serializable {

private String name;

private transient Integer age;

}

测试类:

/**

  • @author xppll

  • @date 2021/12/23 22:32

*/

public class test {

public static void main(String[] args) {

File file = new File(“D://out.txt”);

//序列化对象

try (ObjectOutputStream oos = new ObjectOutputStream(

new FileOutputStream(file)

)) {

Person person = new Person(“dad”, 13);

oos.writeObject(person);

} catch (IOException e) {

e.printStackTrace();

}

}

}

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVaajKDz-1640303890484)(【面试题】Java基础篇-常见面试题总结p3.assets/image-20211223231546852.png)]

可以看出没有age属性

👨‍💻面试官继续追问:关于transient的使用有什么需要注意的?

  • transient 只能修饰变量,不能修饰类和方法。

  • transient 修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰 int 类型,那么反序列后结果就是 0

  • static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化

紧接上个测试案例,反序列化:

//反序列化

try (ObjectInputStream oos = new ObjectInputStream(

new FileInputStream(file)

)) {

Person res = (Person) oos.readObject();

System.out.println(res

);

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

控制台输出:

可以看出transient 修饰的变量,在反序列化后变量值将会被置成类型的默认值

8.说一下Java 中 IO 流分为几种?


  • 按照流的流向分,可以分为输入流和输出流

  • 按照操作单元划分,可以划分为字节流和字符流

  • 按照流的角色划分为节点流和处理流

Java IO 流共涉及 40 多个类,这40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

按操作方式分类结构图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rzdhNbiY-1640303890486)(【面试题】Java基础篇-常见面试题总结p3.assets/IO-操作方式分类.png)]

按操作对象分类结构图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcBE5toh-1640303890488)(【面试题】Java基础篇-常见面试题总结p3.assets/IO-操作对象分类.png)]

👨‍💻面试官追问:既然有了字节流,为什么还要有字符流??

字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好

9.请你说一说BIO、NIO、AIO 有什么区别?


在对比这三者的区别之前,先了解一下什么是同步/异步、阻塞/非阻塞:

  • 同步:一个任务的完成之前不能做其他操作,必须等待(相当于在打电话)
  • 异步:一个任务的完成之前,可以进行其他操作(相当于在聊QQ)
  • 阻塞:是相对于CPU来说的, 挂起当前线程,不能做其他操作只能等待
  • 非阻塞:无须挂起当前线程,也可以去执行其他操作
  • BIO:Block IO 同步阻塞,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。每当有一个客户端向服务器发起请求时,服务器都要启动一个线程,无论客户端是否响应,线程都必须一直等待。如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0DICxp1-1640303890490)(【面试题】Java基础篇-常见面试题总结p3.assets/20210205221539278.png)]

  • NIO:New IO 同步非阻塞,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。服务器用一个线程来处理多个请求,客户端发送的请求会注册到多路复用器(selector选择器)上,有I/O请求的客户端分配线程处理,如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6RjOLyg-1640303890493)(【面试题】Java基础篇-常见面试题总结p3.assets/2021020522291755.png)]

  • AIO:Asynchronous IO 异步非阻塞,是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的 操作。

10.Java中的深拷贝和浅拷贝有了解过吗?


  • 浅拷贝

对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。

  • 深拷贝

对于基础数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。

下面举个详细的例子:

浅拷贝

/**

  • @author xppll

  • @date 2021/12/21 12:27

*/

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Address implements Cloneable{

private String name;

@Override

protected Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

/**

  • @author xppll

  • @date 2021/12/21 12:29

*/

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Person implements Cloneable{

private Address address;

@Override

protected Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

测试:

/**

  • @author xppll

  • @date 2021/12/21 12:30

*/

public class Test {

public static void main(String[] args) throws CloneNotSupportedException {

Person person1 = new Person(new Address(“长沙”));

Person person2 = (Person) person1.clone();

System.out.println(person1.getAddress()==person2.getAddress());//true

}

}

从结果可以看出, person1 的克隆对象和 person1 使用的仍然是同一个 Address 对象。

深拷贝

这里我们简单对 Person 类的 clone() 方法进行修改,连带着要把 Person 对象内部的 Address 对象一起复制。

/**

  • @author xppll

  • @date 2021/12/21 12:29

*/

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Person implements Cloneable {

private Address address;

@Override

protected Object clone() throws CloneNotSupportedException {

Person person = (Person) super.clone();

person.setAddress((Address) person.getAddress().clone());

return person;

}

}

再次测试:

/**

  • @author xppll

  • @date 2021/12/21 12:30

*/

public class Test {

public static void main(String[] args) throws CloneNotSupportedException {

Person person1 = new Person(new Address(“长沙”));

Person person2 = (Person) person1.clone();

System.out.println(person1.getAddress()==person2.getAddress());//false

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

美团二面惜败,我的凉经复盘(附学习笔记+面试整理+进阶书籍)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Address(“长沙”));

Person person2 = (Person) person1.clone();

System.out.println(person1.getAddress()==person2.getAddress());//false

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

[外链图片转存中…(img-m5UfzVnn-1713442173280)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-Rhmngomk-1713442173281)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值