【亲身面经分享,校招实习面试系列】每日10题,快速学习(Java基础篇)

每天进步亿点点

年刚过,各个大小公司都陆续开启春招了

眼下已经2月底,金三银四的号角已经吹响(`・ω・)

备战校招或暑期实习,时机正好~

博主在秋招已拿多个offer,现在把亲身面试经历分享给大家

无论是同届小伙伴还是学弟学妹,希望大家每天都进步亿点点(‐^▽^‐),每日10题,快速学习

1、Java线程池7个参数分别是什么?

  1. corePoolSize:池核心线程大小

  2. maximunPoolSize: 线程池最大线程数量

  3. keepAliveTime: 空闲线程存活时间

  4. unit:空闲线程存活时间的单位

  5. workQueue: 工作队列(4种)

    (1)ArrayBlockingQueue:基于数组有界阻塞队列,FIFO
    (2)LinkedBlockingQueue:基于链表无界阻塞队列(最大容量Integer.MAX_VALUE)FIFO
    (3)SynchronousQueue:不缓存任务的阻塞队列
    (4)PriorityBlockingQueue:基于优先级无界阻塞队列

  6. threadFactory: 线程工厂

  7. handler: 拒绝策略

    策略1:ThreadPoolExecutor.AbortPolicy(默认,拒绝执行任务)

    策略2:ThreadPoolExecutor.CallerRunsPolicy(运行被拒绝的任务,若执行程序已关闭,则会丢弃该任务)

    策略3:ThreadPoolExecutor.DiscardOldestPolicy(丢弃等待队列中的队头任务)

    策略4:ThreadPoolExecutor.DiscardPolicy(通过源码可以看出,该策略不会执行任务操作)

2、4种线程池的特点?

Java通过Executors提供以下4种线程池。

  1. newSingleThreadExecutor:

    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

  2. newFixedThreadPool:

    创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

  3. newScheduledThreadPool:

    创建一个可定期或者延时执行任务定长线程池,支持定时及周期性任务执行。 数量为
    2 32 − 1. 2^{32} - 1. 2321.

  4. 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 中变量的加载顺序是什么样子?

  • 如果类还没有被加载

    1. 先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
    2. 执行子类的静态代码块和静态变量初始化。
    3. 执行父类的实例变量初始化
    4. 执行父类的构造函数
    5. 执行子类的实例变量初始化
    6. 执行子类的构造函数
  • 如果类已经被加载:静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。

10、实现同步的方法有哪些?

  1. 阻塞(互斥同步):synchronized、ReentrantLock
  2. 非阻塞:原子变量AtomicInteger…
  3. 无同步:volatile(内存可见)、ThreadLocal(局部变量)


欢迎“一键三连”哦,点赞加关注,收藏不迷路!每天进步亿点点,我们下篇见!(⊙ᗜ⊙)


本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/123063824

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆海潘江小C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值