- 博客(95)
- 收藏
- 关注
原创 2024程序员必须要会的Java面试八股文
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
2024-06-25 16:26:32
505
原创 Java程序员必须要会的124道面试题(含答案)
double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。
2024-06-25 16:25:12
881
原创 国内最全Java面试题(面试必备)
反射是通过获取类的class对象,然后动态的获取到这个类的内部结构,动态的去操作类的属性和方法。应用场景有:要操作权限不够的类属性和方法时、实现自定义注解时、动态加载第三方jar包时、按需加载类,节省编译和初始化时间;获取class对象的方法有:class.forName(类路径),类.class(),对象的getClass()当一个线程被剥夺cpu使用权时,切换到另外一个线程执行死锁指多个线程在执行过程中,因争夺资源造成的一种相互等待的僵局。
2024-06-25 16:22:22
743
原创 2024年最新版Java面试题(带全部答案)
阻止故障的连锁反应,实现熔断快速的失败,实现优雅降级提供实时的监控和警告线程隔离:互不影响,但是会建很多线程型号量隔离:型号量有限。
2024-06-24 14:19:14
967
原创 Java面试八股文合集(持续更新)
我们使用java编译命令就能将java源文件编译对应成字节码文件(.class),字节码文件是一种八位数据的二进制流文件,可以被JVM快速加载到内存中运行AQS全称abstractQueueSynchronizer,即抽象队列同步器,是一种锁机制,它是作为一个基础框架使用的,像Reentrantlock,countdownlatch都是基于AQS实现的AQS内部维护了一个先进先出的双向队列,队列中存储了排队的线程。
2024-06-23 21:45:48
820
原创 2024年最新版Java面试八股文
不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。
2024-06-23 21:43:49
633
原创 2024最新Java面试八股文
不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。
2024-06-23 21:42:59
661
原创 Java面试题(带全部答案)2023年最新版
不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。
2024-06-23 21:41:56
546
原创 史上最全Java面试题(带全部答案)2023年最新版
不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。
2024-06-23 21:41:14
895
原创 【最详细】2024最全java面试题及答案
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
2024-06-23 21:38:39
1175
原创 【最详细】最全java面试题及答案
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
2024-06-23 21:36:49
854
原创 最全 Java 面试八股文(真实,高频,有详细答案)
double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。它唯一的好处就是你只需等待很短的时间,如几微秒或几纳秒。是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 128。
2024-06-23 21:34:45
2035
原创 Java程序员不得不会的124道面试题(含答案)
double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。它唯一的好处就是你只需等待很短的时间,如几微秒或几纳秒。是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 128。
2024-06-23 21:33:26
776
原创 史上最全面Java面试汇总(面试题+答案)
泛型,即“参数化类型”。创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。泛型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下: 1).将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。2).移除所有的类型参数。
2024-06-23 21:31:19
745
原创 2024最全 Java 面试八股文(真实,高频,有详细答案)
2024 年的互联网行业竞争越来越严峻,也是越来越难,一直以来我都想整理一套完面试宝典,奈何难抽出时间,这套 1000+道的面试手册我整理了整整 1 个月,上传到 Git 上目前 star 数达到了 30K+
2024-06-21 14:04:21
974
原创 2024最全 Java 面试八股文(真实,高频,有详细答案)
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
2024-06-21 14:00:19
960
原创 Java面试题总结(含答案)
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
2024-06-21 13:58:55
659
原创 Java程序员必须要会的124道面试题(含答案
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
2024-06-21 13:57:54
534
原创 Java面试题及答案整理( 2024年 6 月最新版,持续更新)
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
2024-06-21 13:56:07
1298
原创 CSDN全网详细JAVA八股文!
被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。局部变量存储于栈内存中,作用的范围结束,变量空间会自动的释放。- 创建ModelAndView对象,添加返回的数据和地址。,它存储于对象所在的堆内存中,生命周期与对象相同;- ModelAndView(只向前端传输数据)(案例取自遇见狂神说的java课程视频)成员变量是在类的范围里定义的变量;未被static修饰的成员变量也叫。局部变量是在方法里定义的变量;局部变量没有默认初始值;
2024-06-21 13:54:34
554
原创 Java面试宝藏包含了15个技术栈(面试必备)
被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。局部变量存储于栈内存中,作用的范围结束,变量空间会自动的释放。- 创建ModelAndView对象,添加返回的数据和地址。,它存储于对象所在的堆内存中,生命周期与对象相同;- ModelAndView(只向前端传输数据)(案例取自遇见狂神说的java课程视频)成员变量是在类的范围里定义的变量;未被static修饰的成员变量也叫。局部变量是在方法里定义的变量;局部变量没有默认初始值;
2024-06-21 13:53:33
946
原创 202全网详细JAVA八股文,欢迎收藏
被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。局部变量存储于栈内存中,作用的范围结束,变量空间会自动的释放。- 创建ModelAndView对象,添加返回的数据和地址。,它存储于对象所在的堆内存中,生命周期与对象相同;- ModelAndView(只向前端传输数据)(案例取自遇见狂神说的java课程视频)成员变量是在类的范围里定义的变量;未被static修饰的成员变量也叫。局部变量是在方法里定义的变量;局部变量没有默认初始值;
2024-06-21 13:52:08
853
原创 Java核心面试八股文(面试必备)
被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。局部变量存储于栈内存中,作用的范围结束,变量空间会自动的释放。- 创建ModelAndView对象,添加返回的数据和地址。,它存储于对象所在的堆内存中,生命周期与对象相同;- ModelAndView(只向前端传输数据)(案例取自遇见狂神说的java课程视频)成员变量是在类的范围里定义的变量;未被static修饰的成员变量也叫。局部变量是在方法里定义的变量;局部变量没有默认初始值;
2024-06-20 19:42:24
998
原创 全网详细JAVA八股文,欢迎收藏
被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。局部变量存储于栈内存中,作用的范围结束,变量空间会自动的释放。- 创建ModelAndView对象,添加返回的数据和地址。,它存储于对象所在的堆内存中,生命周期与对象相同;- ModelAndView(只向前端传输数据)(案例取自遇见狂神说的java课程视频)成员变量是在类的范围里定义的变量;未被static修饰的成员变量也叫。局部变量是在方法里定义的变量;局部变量没有默认初始值;
2024-06-20 19:41:48
862
原创 史上最全JAVA八股文,欢迎收藏
被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。局部变量存储于栈内存中,作用的范围结束,变量空间会自动的释放。- 创建ModelAndView对象,添加返回的数据和地址。,它存储于对象所在的堆内存中,生命周期与对象相同;- ModelAndView(只向前端传输数据)(案例取自遇见狂神说的java课程视频)成员变量是在类的范围里定义的变量;未被static修饰的成员变量也叫。局部变量是在方法里定义的变量;局部变量没有默认初始值;
2024-06-20 19:40:38
767
原创 2025最全Java面试题及答案整理
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
2024-06-20 19:38:32
922
原创 牛客网最强Java面试八股文(2024年6月持续更新)
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
2024-06-20 19:37:34
809
原创 2024Java面试题找工作必备(600道)
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
2024-06-20 19:36:22
629
原创 Java面试题总结(含答案)
•InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。•OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
2024-06-20 19:35:10
589
原创 互联网最强Java面试八股文(1000道)
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
2024-06-20 19:34:01
297
原创 CSDN最全Java面试题及答案整理
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
2024-06-20 19:32:54
770
原创 2024最全Java面试题及答案整理
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
2024-06-20 19:31:32
2294
原创 高频Java面试题集锦(含答案),让你的面试之路畅通无阻!
•InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。•OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
2024-06-19 14:17:22
540
原创 全网最强Java面试八股文
double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。
2024-06-19 14:14:27
936
原创 全套Java面试八股文(含答案)
double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。
2024-06-19 14:13:26
1475
原创 2025JAVA面试题大全(200+道题目)
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。java 提供了一个 java.util.concurrent.Executor 接口的实现用于创建线程池。CAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。
2024-06-19 14:10:09
536
原创 2024JAVA面试题大全(1000+道题目)
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。java 提供了一个 java.util.concurrent.Executor 接口的实现用于创建线程池。CAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。
2024-06-19 14:09:33
557
原创 Java面试八股文(面试必备)
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。java 提供了一个 java.util.concurrent.Executor 接口的实现用于创建线程池。CAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。
2024-06-19 14:08:40
695
原创 CSDN最全Java面试八股文
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。java 提供了一个 java.util.concurrent.Executor 接口的实现用于创建线程池。CAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。
2024-06-19 14:07:42
779
原创 2024全网最全JAVA面试八股文,终于整理完了
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。java 提供了一个 java.util.concurrent.Executor 接口的实现用于创建线程池。CAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。
2024-06-19 14:07:06
2800
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人