自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?)

什么是线程池?线程池是一种基于池化思想管理和使用线程的机制。它内部维护了多个线程,等待着分配由用户提交的并发执行的任务。这避免了频繁创建和销毁线程带来的开销,从而提高了系统的响应速度和资源利用率。线程池的核心原理是“线程复用”和“资源控制”。线程复用: 传统的“一任务一线程”模式在任务执行完毕后,线程就会销毁。线程池则让核心线程在执行完任务后不会立即销毁,而是处于等待状态,去获取新的任务来执行。这样就省去了频繁创建和销毁线程的巨大开销(包括系统调用、内存分配、资源初始化等)。资源控制。

2025-08-30 23:42:22 1110

原创 每日Java并发面试系列(4):基础篇(DCL、volatile适用场景、如何在多线程环境下i++结果正确、什么是CAS、有哪些可以实现线程安全的方式、Java的原子操作)

CAS(Compare-And-Swap,比较并交换)是一种无锁(lock-free)的原子操作算法,是现代CPU广泛支持的一种硬件指令(如x86的CMPXCHG指令)。它是实现并发容器和原子类的基石。工作原理:它包含三个操作数——内存位置(V)预期原值(A)和新值(B)。当CAS指令执行时,它会比较内存位置V的值与预期原值A是否相等。如果相等,处理器会自动将该位置的值更新为新值B。如果不相等,处理器不做任何操作,操作失败。整个操作是一个不可分割的原子操作。存在的问题(缺点)ABA问题。

2025-08-29 21:30:00 1149

原创 每日Java并发面试系列(3):基础篇(线程的run与start的区别、如何理解线程安全问题、SimpleDateFormat是线程安全的吗?yield()方法?锁的优化?什么是volatile?)

​Java并发基础(1)Java并发基础(2)这是一个最基础但至关重要的区别,理解它能帮你弄清线程是如何被执行的。核心总结:示例:2. 你是怎么理解线程安全问题的?线程安全问题的本质是:当多个线程并发访问(读/写)共享的可变数据或资源时,由于操作系统线程调度的不确定性,导致最终执行结果存在不确定性,从而出现错误或数据不一致的现象。我可以从一个生活化的例子来理解:假设一个银行账户(共享资源)里有 100 元。从技术层面讲,其根源来自于三大问题:解决线程安全问题的核心思路就是通过各种同步机制(如 、

2025-08-27 22:25:24 915

原创 每日Java并发面试系列(2):基础篇(wait/sleep,notify/noitfyAll的区别、什么是线程池,如何实现?线程池的核心参数?拒绝策略?线程池工作流程、如何合理分配线程池、线程同步)

虚假唤醒:指的是一个正在等待的线程(例如调用了wait())在没有被其他线程通过notify()或显式唤醒,也没有被中断的情况下,莫名其妙地自行恢复了运行。原因:这种现象是由于底层操作系统线程调度的高度复杂性导致的,在 Linux 和 Windows 等主流平台上都有可能发生。Java 语言规范(JLS)允许这种行为,以平衡性能和语义的精确性。防范方法永远不要在条件判断中使用if语句,而应该使用while循环。这样,即使线程被虚假唤醒了,它也会再次检查等待条件是否真正满足。如果不满足,它会继续等待。

2025-08-26 22:58:41 1153

原创 每日Java并发面试系列(1):基础篇(什么是并发、什么是并行?什么是守护线程,与普通线程的区别?线程有几种状态?创建线程的方式?线程阻塞的一些方法?为什么推荐使用线程池而不使用new Thread)

这是并发编程中最基础的两个概念,它们经常被混淆,但有着本质的区别。并发:并发指的是多个任务在重叠的时间段内交替执行。在单个CPU核心上,通过时间片轮转等调度算法,快速切换执行多个线程,从宏观上看这些任务像是在同时进行,但微观上任何时刻都只有一个任务在执行。它解决的是“任务切分”的问题,是一种程序的设计结构。它关注的是如何在一个处理单元上管理多个任务的执行顺序,以最大化利用CPU资源(例如,当一个任务等待I/O时,CPU可以去执行另一个任务)。一个咖啡师(单核CPU)同时接待三位顾客(三个任务)。

2025-08-25 22:42:47 722

原创 每日Java集合面试系列(6):基础篇(ConcurrentHashMap的分段技术、size()方法如何实现、读操作需要加锁吗?为什么并行流底层使用的是哪种线程池?如何自定义并行流的线程池?)

不建议也不容易直接为某个并行流指定一个自定义线程池。因为并行流的设计是与公共池深度绑定的。你可以将任务提交到一个自定义的中执行,在这个任务内部使用并行流。// 1. 创建一个自定义的 ForkJoinPool// 指定并行度为4// 2. 向这个池提交一个任务,在任务内使用并行流list.parallelStream() // 此刻这个并行流将在 customThreadPool 中运行.sum()).get();// 记得关闭池这样做需要非常小心,因为很容易导致死锁和线程饥饿。

2025-08-24 22:36:03 746

原创 每日Java集合面试系列(5):基础篇(红黑树的阈值、红黑树与 AVL树的区别、HashMap在并发环境可能出现的问题、扩容时如何重新计算索引、JDK1.7和JDK1.8扩容的区别、死链如何产生)

这是一个基于泊松分布的概率统计结果,目的是在空间和时间成本上取得平衡。树化阈值 (TREEIFY_THRESHOLD = 8)在理想的随机哈希情况下,一个桶中链表长度达到 8 的概率极低(约为0.00000006,即千万分之六)。选择 8 作为一个“几乎不会发生”的阈值。如果在这种情况下真的发生了,说明哈希冲突已经非常严重,此时将链表转换为红黑树来提升查询效率(从O(n)提升到O(log n))是值得的,尽管红黑树需要占用更多空间。这是一种防患于未然的策略。

2025-08-23 21:05:08 1239

原创 每日Java集合面试系列(4):基础篇(HashMap的初始容量、HashMap构造方法有哪些、为什么默认容量是16、如何根据业务场景调整负载因子、负载因子与阈值的关系、HashMap的扰动函数)

HashMap 的容量必须是 2 的幂次方(如 16, 32, 64),这是为了优化哈希计算和元素分布(原因详见第10个问题)。当你传入一个非 2 的幂次方的容量(如 10)时,HashMap 不会直接使用它,而是会通过。这个值被选为默认值,是因为它在大多数中小规模的场景下,提供了一个良好的起点:既不会立即触发扩容,也不会过度浪费内存。的防御性策略:在正常情况下使用高效的链表,只在极端情况下才启用更复杂的数据结构来保住性能底线。最高位以下的所有位都变为 1,最后再加 1,从而得到 2 的幂次方。

2025-08-22 21:00:00 1075

原创 每日Java集合面试系列(3):基础篇(List有几种排序方式、Comparable 和Comparator的区别、如何实现自定义排序、HashMap红黑树、hash、hashMap的get复杂度)

Java集合基础(1)Java集合基础(2)今天是Java集合基础的第三篇。实现自定义排序通常使用Comparator接口,特别是通过方法引用和链式调用。对于多个字段排序,使用// 假设 Person 类有 name 和 age 字段// 按 name 升序,然后按 age 降序// 或者使用 lambda// 降序});这种方式简洁且易读,体现了 Java 8 函数式编程的优势。

2025-08-21 22:00:00 2365

原创 每日Java集合面试系列(2):基础篇(ArrayList、LinkedList与Vector的区别、什么场景下ArrayList的插入性能会优于LinkedList、HashMap相关问题)

"Java集合"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少10道经典面试题,涵盖Java集合、进阶、框架等各方面知识。坚持学习天,助你面试通关!

2025-08-20 22:42:03 1075

原创 每日Java集合面试系列(1):基础篇(Collection与Map的区别、Set接口如何保证元素唯一性、fail-fast与fail-safe的区别、ArrayList相关问题)

线程安全机制:方法级 synchronized 锁锁粒度:在方法声明添加关键字(如),相当于锁定整个 Vector 实例(对象锁)。问题粗粒度锁导致高并发场景下性能低下(即使独立操作如get(0)和get(1)也需串行执行)。替代方案:提供同步包装器(锁粒度同 Vector)。:写时复制(读无锁,写加锁)。:CAS 无锁队列。

2025-08-19 22:00:00 1173

原创 每日Java面试系列(16):进阶篇(无参构造相关问题,如何为不可变类实现高效的 hashCode方法?Java还有哪些约定需要遵守?为什么选择31作为哈希计算中的乘数?)

本文介绍了Java面试中关于构造函数、hashCode和equals方法的核心知识点。在构造函数部分,探讨了无参构造函数的访问修饰符选择、何时可以省略无参构造,以及反射创建对象和单例模式的实现要点。在hashCode和equals部分,详细讲解了不可变类的高效hashCode实现、Java编程约定、继承关系中的equals处理,以及选择31作为哈希乘数的原因。这些内容涵盖了Java基础面试中的常见问题,特别强调了设计模式、性能优化和编程规范等关键点,为Java开发者系统准备面试提供了实用指导。

2025-08-18 22:00:00 838

原创 每日Java面试系列(15):进阶篇(String不可变的原因、性能问题、String三剑客、自定义不可变设计、组合优于继承等相关问题)

/ 1. final类 + final字段// 引用类型需特殊处理// 2. 构造器初始化所有状态this.x = x;this.y = y;// 3. 防御性复制:防止外部修改传入的集合// 4. 不提供setter,只提供getter// 5. 返回不可变副本关键防御点:对引用类型字段做深度保护(深拷贝或返回只读视图)

2025-08-17 20:00:00 743

原创 每日Java面试系列(14):进阶篇(UUID与其他ID生成策略相比有什么优缺点、UUID 作为数据库主键会带来什么问题、你在项目中是如何选择和使用唯一的标识符的、Java异常、类加载)

"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!UUID适用于小型分布式系统,Snowflake是高性能分布式场景首选,数据库自增仅适合单体架构。WebApp1类加载器。WebApp2类加载器。

2025-08-17 10:02:54 908

原创 每日Java面试系列(13):进阶篇(深拷贝中的循环引用问题、clone()方法与复制构造函数对比、序列化实现深拷贝的性能与问题、浅拷贝的问题与规避、Java 新特性特征)

"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!基础面试题:每日5题Java面试系列基础(1)每日5题Java面试系列基础(2)每日5题Java面试系列基础(3)每日5题Java面试系列基础(4)每日5题Java面试系列基础(5)每日5题Java面试系列基础(6)每日5题Java面试系列进阶(7)每日5题Java面试系列进阶(8)每日5题Java面试系列进阶(9)

2025-08-16 20:00:00 996

原创 每日5题Java面试系列(12):进阶篇(枚举底层实现原理、如何通过枚举实现单例模式、EnumSet 和EnumMap有什么特点和优势、枚举的序列化机制有什么特殊之处、Netty框架相关)

"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!

2025-08-16 09:00:00 1078

原创 每日5题Java面试系列(11):进阶篇(检查性异常设计是好的吗、如何在实际项目中设计异常设计和处理、自定义异常应该继承Exception还是RuntimeException、finally相关问题)

"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!基础面试题:每日5题Java面试系列基础(1)每日5题Java面试系列基础(2)每日5题Java面试系列基础(3)每日5题Java面试系列基础(4)每日5题Java面试系列基础(5)每日5题Java面试系列基础(6)每日5题Java面试系列进阶(7)每日5题Java面试系列进阶(8)每日5题Java面试系列进阶(9)

2025-08-15 20:00:00 2245

原创 每日5题Java面试系列(10):进阶篇(注解与XML相比、实现自定义注解处理器、运行时注解和编译时注解有什么区别、不同序列化、序列化的风险、优化序列化性能、分布式系统中序列化的风险)

"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!基础面试题:每日5题Java面试系列基础(1)每日5题Java面试系列基础(2)每日5题Java面试系列基础(3)每日5题Java面试系列基础(4)每日5题Java面试系列基础(5)每日5题Java面试系列基础(6)每日5题Java面试系列进阶(7)每日5题Java面试系列进阶(8)每日5题Java面试系列进阶(9)定义注解。

2025-08-14 20:00:00 1105

原创 每日5题Java面试系列(9):进阶篇(什么情况下应该使用反射,有哪些知名框架使用了反射?Method.invoke 的底层实现原理是什么?反射与动态代理有什么关系、Java 9反射优化、构造方法)

欢迎来到"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!基础面试题:每日5题Java面试系列基础(1)每日5题Java面试系列基础(2)每日5题Java面试系列基础(3)每日5题Java面试系列基础(4)每日5题Java面试系列基础(5)每日5题Java面试系列基础(6)每日5题Java面试系列基础(7)每日5题Java面试题系列进阶(8)

2025-08-13 21:00:00 1267

原创 每日5题Java面试系列(8):进阶篇(泛型擦除、泛型通配符、Java泛型与C Sharp泛型的区别、泛型在集合框架中应用有哪些、SPI与API的区别、如何实现自己的SPI扩展点等)

​类型擦除是Java泛型实现的核心机制,它通过编译时类型检查、运行时擦除类型信息的方式实现了泛型,同时保持了与老版本Java的兼容性。具体来说,编译器会在编译时进行类型检查,然后将泛型类型替换为它们的限定类型(通常是Object),并在必要时插入类型转换。​​运行时类型信息丢失​​:无法在运行时获取泛型的具体类型参数,例如和在运行时都是List​​实例化限制​​:不能直接实例化类型参数,如new T()是不允许的​​数组创建限制​​:不能创建泛型数组,如new T[10]​​方法重载问题​。

2025-08-12 21:00:00 1858

原创 每日5题Java面试系列(7):进阶篇(String的intern()方法,Java 9 的变化、浏览器乱码怎么解决、UTF-8成为主流编码的原因、BOM的作用与争议)

欢迎来到"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选至少5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!基础面试题:每日5题Java面试系列(1)每日5题Java面试系列(2)每日5题Java面试系列(3)每日5题Java面试系列(4)每日5题Java面试系列(5)每日5题Java面试系列(6)核心理解: 是 字符串驻留(String Interning) 的核心方法,用于将字符串对象手动加入 JVM 的字符串常量

2025-08-11 21:00:00 579

原创 每日5题Java面试系列(6):基础篇(无参构造函数、equals与hashCode方法、Integer、为什么重写equals一定要重写HashCode方法)

欢迎来到"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!历史面试题:每日5题Java面试系列(1)每日5题Java面试系列(2)每日5题Java面试系列(3)每日5题Java面试系列(4)每日5题Java面试系列(5)作为Java程序员,我认为无参构造函数的设计是类设计的重要考量点,其背后有深刻的工程实践意义:核心原因分析:框架兼容性:• 反射机制(如Spring、Hibe

2025-08-10 23:53:26 1009

原创 每日5题Java面试系列(5):基础篇(JDK新特性、UUID、ClassNotFoundException 和 NoClassDefFoundError 的区别是什么、String不可变等等)

UUID (Universally Unique Identifier)是一个128位的标识符,标准格式为32个十六进制数字,分为5段(8-4-4-4-12)。UUID版本:• 版本1:基于时间戳和MAC地址• 版本2:DCE安全UUID• 版本3:基于MD5哈希和命名空间• 版本4:随机生成(最常用)• 版本5:基于SHA-1哈希和命名空间唯一性保证:理论上,UUID可以保证"几乎"唯一,但不是绝对唯一。具体分析:版本4(随机)UUID:碰撞概率极低但不为零。

2025-08-09 22:46:49 781

原创 每日5题Java面试系列(4):基础篇(异常、finally中代码一定会执行吗、Java枚举、什么是AIO、BIO和NIO、什么是深拷贝和浅拷贝)

BIO 、NIO 和 AIO 是 Java 三种不同的 IO模型,它们代表了 IO 处理方式的演进过程。BIO (Blocking IO)是传统的同步阻塞 IO模型,在 java.io 包中,它的特点是简单直观:当线程发起 IO 操作后,会一致阻塞直到操作完成才返回。典型实现如 ServerSocket.accept()和InputStream.read()。BIO 模型中通常一个连接需要一个线程处理,因此在高并发场景下会创建大量线程,导致系统资源消耗过大。它适合连接数少且固定的场景,如简单的客户端应用。

2025-08-08 22:00:00 867

原创 每日5题Java面试系列(3):基础篇(SPI机制、反射、创建对象的方式、注解、序列化与反序列化)

欢迎来到"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!历史面试题:每日5题Java面试系列(1)每日5题Java面试系列(2)SPI(Service Provider Interface)是Java 提供的一种服务发现机制,它允许应用程序在运行时动态发现和加载服务实现。本质上,SPI 是一种基于接口的可插拔设计模式,实现了接口与实现的解耦SPI 的核心工作原理是:首先定义服务接口

2025-08-07 22:00:00 1131

原创 每日5题Java面试系列(2):基础篇(BigDecimal、String三剑客、常见字符编码、泛型)

泛型是Java中允许我们在定义类、接口和方法时使用类型参数的一种特性,这些类型参数在使用时被具体类型替换。简单说,泛型就是"参数化类型",使得同一段代码可以操作不同类型的数据。泛型的主要优势有四点首先,泛型提供了编译时类型安全检查。比如,对于泛型集合 List ,在编译阶段就能发现类型错误(如尝试添加 Integer),避免了运行时的 ClassCastException。相比之下,非泛型集合需要在运行时进行类型转换,可能会引发异常:list.add(10)//编译错误,立即发现问题。

2025-08-06 21:00:00 798

原创 每日5题Java面试系列(1):基础篇(面向对象与面向过程、接口与抽象类的选择、如何理解Java中的多态、Java中有了基本类型为什么还需要包装类、用浮点数表示金额为什么会出错)

欢迎来到"Java面试基础篇"系列!本系列旨在帮助Java开发者系统性地准备面试,每天精选5道经典面试题,涵盖Java基础、进阶、框架等各方面知识。坚持学习21天,助你面试通关!

2025-08-05 21:00:00 787

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除