成功拿到大厂 offer 的我熬夜整理了这份 Java 高频面试题(含答案)
今日分享开始啦,请大家多多指教~
Throw 和 throws 的区别?
throws 用在方法定义上,后面跟着的是异常类,可以多个。
而 throw 用在方法内部,后面跟着的是异常对象。
throws 表示这个方法可能会抛出哪些异常,这样调用者可以知道这个方法会抛出什么异常,可以提前进行预处理; throw 表示要抛出什么异常对象,throw 后面的语句不会被执行到,会将异常抛出到调用者。
throws 和 throw 都不处理异常,而是将抛出或者可能抛出异常,由调用者去处理异常。
获取 Class 对象有哪些方法?
调用对象的 getClass() 方法来获取。
Person person = new Person();
Class<? extends Person> aClass = person.getClass();
调用类的 class 属性来获取。
Class<Person> personClass = Person.class;
调用 Class 类的 forName() 静态方法来获取,比较常用,也是性能最好的。
Class<?> aClass = Class.forName("com.chenpi.Person");
什么是 Java 反射机制?
Java 反射机制是在运行期,对于任意一个类,都能够获得这个类的所有属性和方法。对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态地获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。
我们知道,程序运行时,允许改变程序结构或变量类型的语言称为动态语言。例如 Python,Ruby 等是动态语言。而 Java 不是动态语言,但是 Java 的反射机制让它成为准动态语言。反射允许静态语言在运行时检查,修改程序的结构与行为。
final 的作用?
final 修饰类时,说明这个类不能被继承。如果你希望一个不要被继承,就可以用 final 关键字修饰。
final 修饰方法,说明这个方法不能被重写。
final 修饰变量,说明这个变量的值赋值后不能被修改。
Java 集合类哪些是线程安全和线程不安全的?
线程安全的集合
Vector
HashTable
Stack
Properties
线程不安全的集合
ArrayList
LinkedList
HashMap
HashSet
TreeMap
TreeSet
JAVA 线程创建方式有哪些?
继承 Thread 类,重写 run 方法。
实现 Runnable 接口,重写 run 方法。
实现 Callable 接口,重写 call 方法,这是一个由返回值的方法。
怎么实现动态代理?
JDK 原生动态代理
Cglib 动态代理
什么是死锁?
线程 A 持有独占锁 a,并且还尝试获取独占锁 b 的同时,线程 B 持有独占锁 b,并且还尝试获取独占锁 a 的情况下,这时 A 和 B 线程都在等待对方释放需要的锁,从而发生的阻塞现象,我们称为死锁。
ArrayList 和 LinkedList 的区别?
ArrayList 底层是基于动态数组的数据结构实现,而 LinkedList 是基于双向链表的数据结构实现。
因为 ArrayList 底层是基于数组实现的,所以 ArrayList 比 LinkedList 随机访问效率快。而 LinkedList 是链表线性的数据结构,所以需要移动指针从前往后依次查找,效率比较慢。
在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高。
需要频繁读取集合中的元素时,推荐使用 ArrayList;在插入和删除操作较多时,推荐使用 LinkedList。
并行和并发有什么区别?
并行是指两个或者多个事件在同一时刻发生;并发是指两个或多个事件在同一时间间隔发生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
Java 访问修饰符有哪些?
构造器(constructor)是否可被重写(override)?
构造器是不能被继承的,所以不能被重写,但是可以被重载。
String 属于基础的数据类型吗?
String 不属于基础类型,String 属于引用类型。基础类型有 8 种:byte、boolean、char、short、int、float、long、double。
普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
JDK 和 JRE 区别?
JDK:Java Development Kit,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment,java 运行环境,提供了 java 的运行环境。
什么是守护线程?
守护线程(daemon thread),是一个服务线程,即服务其他线程的线程。
线程的 run() 和 start() 有什么区别?
线程真正执行的操作是定义在 run() 方法中的,也称为线程体。而通过调用 Thread 类的 start() 方法来启动一个线程。
synchronized 和 volatile 的区别?
volatile 可以告诉告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的。
volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。
volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。
volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。
今日份分享已结束,请大家多多包涵和指点!
如何获取?
转发分享此文,后台私信小编:“1”即可获取。(注:转发分享,感谢大家)
评论