Java面试
文章平均质量分 84
面试题
yujkss
这个作者很懒,什么都没留下…
展开
-
java面试基础(一)
当线程A持有独占锁a,并尝试去获取独占锁b的同时,线程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。原创 2022-09-08 22:47:01 · 236 阅读 · 0 评论 -
0-面试官:== 和 equals 的区别是什么
= 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。原创 2022-09-08 22:36:33 · 123 阅读 · 0 评论 -
14-面试官:单例模式有几种写法?
单例模式适用于经常被访问的对象,或是创建和销毁需要调用大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对象。单例模式的常用实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。从写法的简洁性、线程安全性和代码的易懂性等方面综合来看,博主比较推荐使用枚举或懒汉模式来实现单例模式。原创 2022-09-04 22:03:52 · 140 阅读 · 0 评论 -
13-面试官:synchronized有几种用法?
使用synchronized 无需手动执行加锁和释放锁的操作,我们只需要声明 synchronized 关键字就可以了,JVM 层面会帮我们自动的进行加锁和释放锁的操作。synchronized 可用于修饰普通方法、静态方法和代码块,接下来我们分别来看。synchronized 用 3 种用法,用它可以来修饰普通方法、静态方法和代码块,其中。原创 2022-09-04 21:49:35 · 295 阅读 · 0 评论 -
17-面试官:如何解决线程安全问题?
在 Java 中,解决线程安全问题的手段有 3 种:1.使用线程安全的类,如 AtomicInteger 类;2.使用锁 synchronized 或 ReentrantLock 加锁排队执行;3.使用线程本地变量 ThreadLocal 来处理。参考&鸣谢。原创 2022-09-04 21:38:19 · 184 阅读 · 0 评论 -
12-面试官:如何使用线程池执行定时任务?
线程池执行定时任务的实现方法有 3 个:使用 schedule 方法执行定时任务,只执行一次定时任务。使用 scheduleAtFixedRate 方法执行定时任务,执行多次定时任务,它的执行时间间隔是固定的,不受定时任务执行时长影响(定时任务时间间隔 > 任务执行时间)。使用 scheduleWithFixedDelay 方法执行定时任务,执行多次定时任务,它是在定时任务执行完之后,再隔 N 秒开始执行下一次定时任务,它的执行时间受定时任务执行时长影响。原创 2022-09-04 21:20:51 · 1673 阅读 · 0 评论 -
15-面试官:线程池的拒绝策略有哪些
/ 任务的具体方法 Runnable runnable = new Runnable() {System . out . println("当前任务被执行,执行时间:" + new Date() + " 执行线程:" + Thread . currentThread() . getName());try {// 等待 1s TimeUnit . SECONDS . sleep(1);} } };原创 2022-09-04 21:04:57 · 188 阅读 · 0 评论 -
11-面试管:为什么创建线程池一定要用ThreadPoolExecutor?
线程池的创建方式总共分为两大类:手动使用 ThreadPoolExecutor 创建线程池和自动使用 Executors 执行器创建线程池的方式。其中使用 Executors 自动创建线程的方式,因为线程个数或者任务个数不可控,可能会导致内存溢出的风险,所以在创建线程池时,建议使用 ThreadPoolExecutor 的方式来创建。参考&鸣谢 https://gitee.com/mydb/interview。原创 2022-09-04 20:53:10 · 166 阅读 · 0 评论 -
10-面试官:如何正确停止线程?
/ 自定义中断标识符 public volatile boolean isInterrupt = false;// 如果为 true -> 中断执行 while(!// 业务逻辑处理 } } }但自定义中断标识符的问题在于:线程中断的不够及时。因为线程在执行过程中,无法调用 while(!// 自定义的中断标识符 private static volatile boolean isInterrupt = false;原创 2022-09-04 20:42:09 · 172 阅读 · 0 评论 -
16-面试官:${} 和 #{} 有什么区别?
{}和#{}1 、功能不同:$ {} 是直接替换,而 # {} 是预处理;2 、使用场景不同:普通参数使用 # {} ,如果传递的是 SQL 命令或 SQL 关键字,需要使用 $ {} ,但在使用前一定要做好安全验证;3 、安全性不同:使用 $ {} 存在安全问题,而 # {} 则不存在安全问题。原文。原创 2022-09-04 16:56:23 · 267 阅读 · 0 评论 -
9-面试官:SpringBoot 有几种读取配置文件的方法
使用 @Value 读取配置文件。使用 @ConfigurationProperties 读取配置文件。使用 @PropertySource 读取配置文件。使用 Environment 读取配置文件。使用原生方式读取配置文件。其中最常用的是前 3 种,如果读取某一个配置项可使用 @Value,如果读取一组配置项可使用 @ConfigurationProperties,如果要指定读取某一个具体的配置文件可使用 @PropertySource 来指定。原创 2022-09-04 16:38:17 · 107 阅读 · 0 评论 -
8-面试官:如何实现 List 集合去重?
/ 创建并给 List 赋值 List < Person > list = new ArrayList < >();list . add(new Person("李四" , "123456" , 20));list . add(new Person("张三" , "123456" , 18));list . add(new Person("王五" , "123456" , 22));list . add(new Person("张三" , "123456" , 18));原创 2022-09-04 15:58:59 · 196 阅读 · 0 评论 -
18-面试官:说一下线程生命周期,以及转换过程?
Java 中线程的生命周期有 6 种:NEW(初始化状态)、RUNNABLE(可运行/运行状态)、BLOCKED(阻塞状态)、WAITING(无时限等待状态)、TIMED_WAITING(有时限等待状态)、TERMINATED(终止状态)。原创 2022-09-03 18:19:14 · 111 阅读 · 0 评论 -
7-面试官:为什么需要线程池?什么是池化技术?
线程池是线程使用的一种模式,它将线程和任务的概念分离开,使用线程来执行任务,并提供统一的线程管理和任务管理的实现方法,避免了频繁创建和销毁线程所带来的性能开销。池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。池化技术的优点主要有两个:提前准备和重复利用。线程池是池化技术的典型场景,线程池的优点主要有 4 点:1.复用线程,降低了资源消耗;2.提高响应速度;3.提供了管理线程数和任务数的能力;4.更多增强功能。转载 2022-09-03 14:41:25 · 117 阅读 · 0 评论 -
6-面试官:说说线程池的 7 大参数
核心线程数,线程池正常情况下保持的线程数,大户人家“长工”的数量。:最大线程数,当线程池繁忙时最多可以拥有的线程数,大户人家“长工”+“短工”的总数量。:空闲线程存活时间,没有活之后“短工”可以生存的最大时间。TimeUnit:时间单位,配合参数 3一起使用,用于描述参数 3 的时间单位。:线程池的任务队列,用于保存线程池待执行任务的容器。:线程工厂,用于创建线程池中线程的工厂方法,通过它可以设置线程的命名规则、优先级和线程类型。:拒绝策略,当任务量超过线程池可以保存的最大任务数时,执行的策略。原创 2022-09-03 14:20:27 · 1131 阅读 · 0 评论 -
5-面试官:线程池有几种创建方式?推荐使用哪种?
线程池的创建方式总共有以下 7 种:Executors.newFixedThreadPool:创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。Executors.newCachedThreadPool:创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程。Executors.newSingleThreadExecutor:创建单个线程数的线程池,它可以保证先进先出的执行顺序。原创 2022-09-03 12:26:09 · 453 阅读 · 0 评论 -
4-面试官:有哪些创建线程的方法?推荐使用哪种?
在 Java 语言中,创建线程有 3 大类实现方式、7 种实现方法,如果是 JDK 1.8 以上版本,在不需要获得线程执行结果的情况下,推荐使用 Lambda 方式来创建线程,因为它的写法足够简洁。如果想要获取线程执行结果,可使用 FutureTask + Callable 的方式来实现。原创 2022-09-03 11:56:47 · 277 阅读 · 0 评论 -
3-面试官:HashMap有几种遍历方法?推荐使用哪种?
本文介绍了7 种 HashMap 的遍历方式,其中 JDK 8 之前主要使用 EntrySet 和 KeySet 的遍历方式,而 KeySet 的遍历方式性能比较低,一般不推荐使用。然而在 JDK 8 之后遍历方式就有了新的选择,可以使用比较简洁的 Lambda 遍历,也可以使用性能比较高的 Stream 多线程遍历。原创 2022-09-03 11:40:11 · 118 阅读 · 0 评论 -
2-面试官:重写 equals 时为什么一定要重写 hashCode?
hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的,采用这种方式的原因是可以提高程序插入和查询的速度,如果在重写 equals 时,不重写 hashCode,就会导致在某些场景下,例如将两个相等的自定义对象存储在 Set 集合时,就会出现程序执行的异常,为了保证程序的正常执行,所以我们就需要在重写 equals 时,也一并重写 hashCode 方法才行。原创 2022-09-03 11:18:36 · 130 阅读 · 0 评论 -
1-面试官:int和Integer有什么区别?为什么要有包装类?
int和Integer有什么区别?为什么要有包装类?Java 是一种强数据类型的语言,因此所有的属性必须有一个数据类型。原创 2022-09-03 10:49:43 · 153 阅读 · 0 评论