leetcode java 大厂基础面试题附答案(三)

目录

1. 计算机插上电源操作系统做了什么?(阿里)

2. 一个对象的两个方法加 synchronized,一个线程进去 sleep,另一个线程可以进入到另一个方法吗?(阿里)不能

3. 线程池参数有哪些?(阿里)

4. 线程池拒绝策略有哪些?(阿里)

5. hreadPoolExecutor 线程池,corePoolSize=5,maximumPoolSize=10,queueCapacity=10,有 20 个耗时任务交给这个线程池执行,线程池会如何执行这 20 个任务?(阿里)

6. Java8 新特性有哪些了解?(阿里)

7. 栈会溢出吗?什么时候溢出?方法区会溢出吗?(阿里)

8. 哪些情况下的对象会被垃圾回收机制处理掉?(京东)

9. 静态代理和动态代理的区别,什么场景使用?(京东)

10. 谈谈你对解析与分派的认识。(京东)

11. 如何将一个 Java 对象序列化到文件里?(京东)


1. 计算机插上电源操作系统做了什么?(阿里)


- 加电 – – – – 打开电源开关,给主板和内部风扇供电。
- 启动引导程序 – – – – CPU 开始执行存储在 ROMBIOS 中的指令。
- 开机自检 – – – – 计算机对系统的主要部件进行诊断测试。
- 加载操作系统 – – – – 计算机将操作系统文件从磁盘读到内存中。
- 检查配置文件,定制操作系统的运行环境 – – – – 读取配置文件,根据用户的设置对操作系统进行定制。
- 准备读取命令和数据 – – – – 计算机等待用户输入命令和数据。



2. 一个对象的两个方法加 synchronized,一个线程进去 sleep,另一个线程可以进入到另一个方法吗?(阿里)

不能



3. 线程池参数有哪些?(阿里)


- corePoolSize 核心线程大小。
- maximumPoolSize 线程池最大线程数量。
- keepAliveTime 空闲线程存活时间。
- unit 空间线程存活时间单位。
- workQueue 工作队列。
- threadFactory 线程工厂。
- handler 拒绝策略。



4. 线程池拒绝策略有哪些?(阿里)


- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常(默认拒绝策略)。
- ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务。



5. hreadPoolExecutor 线程池,corePoolSize=5,maximumPoolSize=10,queueCapacity=10,有 20 个耗时任务交给这个线程池执行,线程池会如何执行这 20 个任务?(阿里)


- 如果当前线程数 < corePoolSize,如果是则创建新的线程执行该任务。
- 如果当前线程数 >= corePoolSize,则将任务存入 BlockingQueue。
- 如果阻塞队列已满,且当前线程数 < maximumPoolSize,则新建线程执行该任务。
- 如果阻塞队列已满,且当前线程数 >= maximumPoolSize,则抛出异常。



6. Java8 新特性有哪些了解?(阿里)


- 接口的默认方法。
- Lambda 表达式。
- 函数式接口。
- 方法和构造函数引用。
- Lamda 表达式作用域。
- 内置函数式接口。
- Optional。
- Streams(流)。
- ParallelStreams(并行流)。
- Maps。
- DateAPI(日期相关 API)。
- Annotations(注解)。



7. 栈会溢出吗?什么时候溢出?方法区会溢出吗?(阿里)


栈是线程私有的,它的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表又包含基本数据类型,对象引用类型。如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出 StackOverflowError 异常,方法递归调用产生这种结果。如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是无法申请到足够的内存去完成扩展,或者在新建立线程的时候没有足够的内存去创建对应的虚拟机栈,那么Java虚拟机将抛出一个OutOfMemory异常。(线程启动过多)。方法区会发生溢出。
HotSpot jdk1.7 之前字符串常量池是方法区的一部分,方法区叫做“永久代”,在 1.7 之前无限的创建对象就会造成内存溢出,提示信息:PermGenspace 而是用 jdk1.7 之后,开始逐步去永久代,就不会产生内存溢出。
方法区用于存放 Class 的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等,如果动态生成大量的 Class 文件,也会产生内存溢出。常见的场景还有:大量 JSP 或动态产生 JSP 文件的应用(JSP 第一次运行时需要编译为 java 类)、基于 OSGi 的应用(即使是同一个类文件,被不同的类加载器加载也会视为不同的类)



8. 哪些情况下的对象会被垃圾回收机制处理掉?(京东)


利用可达性分析算法,虚拟机会将一些对象定义为 GCRoots,从 GCRoots 出发沿着引用链向下寻找,如果某个对象不能通过 GCRoots 寻找到,虚拟机就认为该对象可以被回收掉。
- 哪些对象可以被看做是 GCRoots 呢?
1)虚拟机栈(栈帧中的本地变量表)中引用的对象;
2)方法区中的类静态属性引用的对象,常量引用的对象;
3)本地方法栈中 JNI(Native 方法)引用的对象;
- 对象不可达,一定会被垃圾收集器回收么?
即使不可达,对象也不一定会被垃圾收集器回收,1)先判断对象是否有必要执行 finalize() 方法,对象必须重写 finalize() 方法且没有被运行过。2)若有必要执行,会把对象放到一个队列中,JVM 会开一个线程去回收它们,这是对象最后一次可以逃逸清理的机会。



9. 静态代理和动态代理的区别,什么场景使用?(京东)


代理是一种常用的设计模式,目的是:为其他对象提供一个代理以控制对某个对象的访问,将两个类的关系解耦。代理类和委托类都要实现相同的接口,因为代理真正调用的是委托类的方法。区别:
- 静态代理:由程序员创建或是由特定工具生成,在代码编译时就确定了被代理的类是哪一个是静态代理。静态代理通常只代理一个类;
- 动态代理:在代码运行期间,运用反射机制动态创建生成。动态代理代理的是一个接口下的多个实现类;
实现步骤:
a.实现 InvocationHandler 接口创建自己的调用处理器;
b.给 Proxy 类提供 ClassLoader 和代理接口类型数组创建动态代理类;
c.利用反射机制得到动态代理类的构造函数;
d.利用动态代理类的构造函数创建动态代理类对象;
使用场景:Retrofit 中直接调用接口的方法;Spring 的 AOP 机制;



10. 谈谈你对解析与分派的认识。(京东)


解析指方法在运行前,即编译期间就可知的,有一个确定的版本,运行期间也不会改变。解析是静态的,在类加载的解析阶段就可将符号引用转变成直接引用。
分派可分为静态分派和动态分派,重载属于静态分派,覆盖属于动态分派。静态分派是指在重载时通过参数的静态类型而非实际类型作为判断依据,在编译阶段,编译器可根据参数的静态类型决定使用哪一个重载版本。动态分派则需要根据实际类型来调用相应的方法。



11. 如何将一个 Java 对象序列化到文件里?(京东)


ObjectOutputStream.writeObject() 负责将指定的流写入,ObjectInputStream.readObject() 从指定流读取序列化数据。
//写入
try{
  ObjectOutputStream os = new ObjectOutputStream(new
FileOutputStream("D:/student.txt"));
  os.writeObject(studentList);
  os.close();
}catch(FileNotFoundExceptione){
  e.printStackTrace();
}catch(IOExceptione){
  e.printStackTrace();


参考:
链接:https://leetcode.cn/leetbook/read/da-han-hou-duan-gang-ti-mu-he-ji-shang/nipw6t/
 

猜你喜欢

转载自blog.csdn.net/lejian/article/details/129372802