2022年秋招,Java面试八股文(2)
我的回答还是那句话:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。国内的互联网百试,恐怕是现存的,最接近科举考试的制度。
简述 Java 异常的分类
Java 异常分为 Error(程序无法处理的错误),和 Exception(程序本身可以处理的异常)。这两个类均继承 Throwable。
Error 常见的有 StackOverFlowError、OutOfMemoryError 等等。
Exception 可分为运行时异常和非运行时异常。对于运行时异常,可以利用 try catch 的方式进行处理,也可以不处理。对于非运行时异常,必须处理,不处理的话程序无法通过编译。
简述 throw 与 throws 的区别
throw 一般是用在方法体的内部,由开发者定义当程序语句出现问题后主动抛出一个异常。
throws 一般用于方法声明上,代表该方法可能会抛出的异常列表。
出现在 Java 程序中的 finally 代码块是否一定会执行?
当遇到下面情况不会执行。
- 当程序在进入 try 语句块之前就出现异常时会直接结束。
- 当程序在 try 块中强制退出时,如使用 System.exit(0),也不会执行 finally 块中的代码。
其它情况下,在 try/catch/finally 语句执行的时候,try 块先执行,当有异常发生,catch 和 finally 进行处理后程序就结束了,当没有异常发生,在执行完 finally 中的代码后,后面代码会继续执行。值得注意的是,当 try/catch 语句块中有 return 时,finally 语句块中的代码会在 return 之前执行。如果 try/catch/finally 块中都有 return 语句,finally 块中的 return 语句会覆盖 try/catch 模块中的 return 语句。
final、finally 和 finalize 的区别是什么?
- final 用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。
- finally 作为异常处理的一部分,只能在 try/catch 语句中使用,finally 附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。
- finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的 finalize()方法。当垃圾回收器准备好释放对象占用空间时,首先会调用 finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。
简述泛型
泛型,即“参数化类型”,解决不确定对象具体类型的问题。在编译阶段有效。在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型在类中称为泛型类、接口中称为泛型接口和方法中称为泛型方法。
简述泛型擦除
Java 编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程被称为泛型擦除。
简述注解
Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。
其可以用于提供信息给编译器,在编译阶段时给软件提供信息进行相关的处理,在运行时处理写相应代码,做对应操作。
简述元注解
元注解可以理解为注解的注解,即在注解中使用,实现想要的功能。其具体分为:
- @Retention: 表示注解存在阶段是保留在源码,还是在字节码(类加载)或者运行期(JVM 中运行)。
- @Target:表示注解作用的范围。
- @Documented:将注解中的元素包含到 Javadoc 中去。
- @Inherited:一个被@Inherited 注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
- @Repeatable:被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。
简述 Java 中 Class 对象
java 中对象可以分为实例对象和 Class 对象,每一个类都有一个 Class 对象,其包含了与该类有关的信息。
获取 Class 对象的方法:
Class.forName(“类的全限定名”) 实例对象.getClass() 类名.class
Java 反射机制是什么?
Java 反射机制是指在程序的运行过程中可以构造任意一个类的对象、获取任意一个类的成员变量和成员方法、获取任意一个对象所属的类信息、调用任意一个对象的属性和方法。反射机制使得 Java 具有动态获取程序信息和动态调用对象方法的能力。可以通过以下类调用反射 API。
- Class 类:可获得类属性方法
- Field 类:获得类的成员变量
- Method 类:获取类的方法信息
- Construct 类:获取类的构造方法等信息
序列化是什么?
序列化是一种将对象转换成字节序列的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在需要的时候把该流读取出来重新构造成一个相同的对象。
简述 Java 序列化与反序列化的实现
序列化:将 java 对象转化为字节序列,由此可以通过网络对象进行传输。
反序列化:将字节序列转化为 java 对象。
具体实现:实现 Serializable 接口,或实现 Externalizable 接口中的 writeExternal()与 readExternal()方法。
简述 Java 的 List
List 是一个有序队列,在 Java 中有两种实现方式:
ArrayList 使用数组实现,是容量可变的非线程安全列表,随机访问快,集合扩容时会创建更大的数组,把原有数组复制到新数组。
LinkedList 本质是双向链表,与 ArrayList 相比插入和删除速度更快,但随机访问元素很慢。
Java 中线程安全的基本数据结构有哪些
- HashTable: 哈希表的线程安全版,效率低
- ConcurrentHashMap:哈希表的线程安全版,效率高,用于替代 HashTable
- Vector:线程安全版 Arraylist
- Stack:线程安全版栈
- BlockingQueue 及其子类:线程安全版队列