亲身面经分享,校招实习面试系列每日10题,快速学习(Java基础篇)
Posted 陆海潘江小C
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了亲身面经分享,校招实习面试系列每日10题,快速学习(Java基础篇)相关的知识,希望对你有一定的参考价值。
年刚过,各个大小公司都陆续开启春招了
眼下已经2月底,金三银四的号角已经吹响(`・ω・)
备战校招或暑期实习,时机正好~
博主在秋招已拿多个offer,现在把亲身面试经历分享给大家
无论是同届小伙伴还是学弟学妹,希望大家每天都进步亿点点(‐^▽^‐),每日10题,快速学习
1、Java线程池7个参数分别是什么?
-
corePoolSize:池核心线程大小
-
maximunPoolSize: 线程池最大线程数量
-
keepAliveTime: 空闲线程存活时间
-
unit:空闲线程存活时间的单位
-
workQueue: 工作队列(4种)
(1)ArrayBlockingQueue:基于数组的有界阻塞队列,FIFO
(2)LinkedBlockingQueue:基于链表的无界阻塞队列(最大容量Integer.MAX_VALUE)FIFO
(3)SynchronousQueue:不缓存任务的阻塞队列
(4)PriorityBlockingQueue:基于优先级无界阻塞队列 -
threadFactory: 线程工厂
-
handler: 拒绝策略
策略1:ThreadPoolExecutor.AbortPolicy(默认,拒绝执行任务)
策略2:ThreadPoolExecutor.CallerRunsPolicy(运行被拒绝的任务,若执行程序已关闭,则会丢弃该任务)
策略3:ThreadPoolExecutor.DiscardOldestPolicy(丢弃等待队列中的队头任务)
策略4:ThreadPoolExecutor.DiscardPolicy(通过源码可以看出,该策略不会执行任务操作)
2、4种线程池的特点?
Java通过Executors提供以下4种线程池。
-
newSingleThreadExecutor:
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
-
newFixedThreadPool:
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
-
newScheduledThreadPool:
创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。 数量为
2 32 − 1. 2^32 - 1. 232−1. -
newCachedThreadPool:
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
3、Java中实例化对象的方式有哪些?
- new
User user = new User();
-
clone
类需要实现 Cloneable 接口
User user = (User)user1.clone();
-
反射
用 Class.forName方法获取类,在调用类的newinstance()方法
cls = Class.forName("com.dao.User");
user = (User)cls.newInstance();
-
序列化
序列化对象是将对象转化为二进制流,可以写入文件保存;得到该对象则通过反序列化转化为原来的对象实例。
try
ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream("D:/objectUser.txt"));//序列化对象
out.writeObject(user1);//写到文件
out.close();
//反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/objectUser.txt"));
User user = (User)in.readObject();
in.close();
catch(ClassNotFoundException e)
e.printStackTrace();
catch(FileNotFoundException e)
e.printStackTrace();
catch(IOException e)
e.printStackTrace();
4、Java的引用类型有哪几个?
- 强引用:普通的引用,强引用指向的对象不会被回收。
- 软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收。(场景:创建缓存)
- 弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。(场景:WeekHashMap)
- 虚引用:在任何时候都可能被垃圾回收器回收。
5、Java虚拟机(JVM)中各区域的作用?
JVM区域中的划分在不同jdk版本有一些区别:
jdk7:程序计数器、虚拟栈区、本地方法栈、方法区、堆
jdk8:程序计数器、java虚拟栈区、本地方法栈、堆、元数据区、直接内存
这里列出jdk8之后的各区域。
-
程序计数器
程序控制流的指示器,字节码解释器工作时改变计数器的值,获取下一条指令。
-
Java虚拟栈区
生命周期与线程相同。尤指虚拟机栈中的局部变量表,存放着Java虚拟机基本数据类型、对象引用类型和指令地址。
存在两类异常:(1)SOE(线程请求的栈深度大于虚拟机允许的深度)(2)OOME(无法申请足够内存)。
-
本地方法栈
与虚拟机栈类似。虚拟机栈为执行Java方法服务,本地方法栈为本地方法服务。(也存在SOE和OOME)
-
Java堆
虚拟机管理的最大一块内存。存放对象实例,成员变量、GC管理的内存区域。
-
方法区
用于存储已被加载的类型信息、常量、静态变量、代码缓存等。(存在OOME)
-
直接内存:
通过存储在Java堆中的DirectByteBuffer对象作为这块内存的引用,避免了Java堆和Native堆之间的复制,提高性能。
6、抽象类和接口的区别?
-
抽象类可以有构造方法、成员变量,接口没有。
-
抽象类的方法类型可以是public、protected、default,接口只能是默认public。
-
抽象类可以包含静态方法,接口不能。
-
抽象类的静态成员变量可以任意类型,接口只能默认public static final。
-
一个类可以实现多个接口,只能继承一个类。
两者的应用:接口在系统架构设计方法发挥作用,用于定义模块之间的通信契约。抽象类在代码实现方面发挥作用,代码重用。
7、3种类加载器分别是什么?
java程序都会使用到以下3个系统提供的类加载器来进行加载。
-
启动类加载器:
负责加载存放在<JAVA_HOME>\\lib目录,且是JVM可以识别的类库,加载到内存。
启动类加载器无法被Java程序直接引用,用户自定义类加载器时若要把加载请求委派给引导类加载器处理,则直接使用null返回即可。
-
扩展类加载器:
负责加载存放在<JAVA_HOME>\\lib\\ext目录类库。JDK9之后,可以直接使用扩展类加载器加载Class文件。
-
应用程序类加载器:
ClassLoader中getSystem-ClassLoader方法的返回值,也被称为系统类加载器。可以在代码中直接使用这个类加载器,如果没有自定义类加载器,默认为应用程序类加载器。
8、什么是双亲委派?
类加载器之间的父子关系不是以继承关系实现,而是使用组合关系复用父加载器的代码,形成双亲委派模型。
遵循双亲委派机制的程序加载,要求除了顶层的启动类加载器外,其余的类加载器都应有父类加载器。
工作过程:
如果一个类加载器收到类加载请求,它会把请求委派给父类加载器去完成,因此所有的加载请求最终都会传送到最顶层,只有当父加载器无法完成这个加载请求(搜索范围中找不到所需的类),子加载器才会尝试去完成加载。
双亲委派模型优点:
Java中的类随着它的类加载器一起具备了一种带优先级的层次关系。
无论哪个类加载器要加载这个类,都会委派给模型最顶端的启动类加载器,保证在各种类加载器环境中都是一个类。
9、Java 中变量的加载顺序是什么样子?
-
如果类还没有被加载:
- 先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
- 执行子类的静态代码块和静态变量初始化。
- 执行父类的实例变量初始化
- 执行父类的构造函数
- 执行子类的实例变量初始化
- 执行子类的构造函数
-
如果类已经被加载:静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。
10、实现同步的方法有哪些?
- 阻塞(互斥同步):synchronized、ReentrantLock
- 非阻塞:原子变量AtomicInteger…
- 无同步:volatile(内存可见)、ThreadLocal(局部变量)
欢迎“一键三连”
哦,点赞加关注,收藏不迷路!每天进步亿点点,我们下篇见!(⊙ᗜ⊙)
本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/123063824
以上是关于亲身面经分享,校招实习面试系列每日10题,快速学习(Java基础篇)的主要内容,如果未能解决你的问题,请参考以下文章