自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java中既有编译执行又有解释执行,这个怎么理解?

编译阶段javac把.java 源码编译为平台无关的.class 字节码(编译执行,提前做语法检查,生成中间码);运行阶段非热点代码:JVM 解释器逐行解释字节码为机器码执行(解释执行,保证跨平台和启动速度);热点代码:JIT 编译器将字节码编译为机器码缓存,后续直接执行(编译执行,提升运行效率)。

2025-12-15 08:34:08 768

原创 栈桢中引用对象是如何进行的?

栈帧不存对象实例,仅存指向堆对象的引用(地址 / 句柄);引用的核心操作流程:堆创建对象 → 引用入操作数栈 → 构造方法初始化 → 引用存入局部变量表 → 通过引用访问字段 / 调用方法;栈帧销毁后,引用失效,堆对象若无其他引用则被 GC 回收;引用类型(强 / 软 / 弱 / 虚)决定 GC 对堆对象的回收策略,逃逸分析可跳过 “引用” 直接在栈上存储对象字段。

2025-12-11 13:54:47 1257

原创 JVM的程序计数器

程序计数器是 JVM 的 “执行书签”,记录线程当前执行的字节码指令地址,保证线程切换后能恢复执行;它是线程私有的内存区域,且不会抛出 OutOfMemoryError;执行 Native 方法时,程序计数器的值为 undefined。

2025-12-10 15:13:18 652

原创 JSP和Servlet有什么不同

JSP:快速开发动态页面,适合视图层。Servlet:灵活控制请求/响应,适合业务逻辑。实际项目中,二者通常协同使用,Servlet处理逻辑,JSP负责展示。

2025-12-09 11:44:40 371

原创 Stream流的常用方法有哪些?

Stream 方法分为中间操作(链式、惰性,如 filter/map/sorted)和终端操作(终止、立即执行,如 forEach/collect/reduce);核心常用方法:过滤用 filter、转换用 map、收集结果用 collect、聚合用 reduce、遍历用 forEach;关键注意点:流只能执行一次终端操作,执行后流会关闭;Optional 返回值需安全取值(避免空指针)。

2025-12-08 08:40:49 1221

原创 什么是Stream流

Stream 流是 Java 8 引入的处理集合(Collection)的抽象工具,你可以把它理解成:把集合(比如 List、Set)想象成一个装满水的水池,Stream 流就是从水池里流出来的 “水流”—— 你可以在水流上做过滤、加工、排序等操作,操作的是 “水流” 里的元素,而不会改变原水池(原集合)的内容,最终还能把处理后的水流重新收集成新的集合。它不是数据结构(不存储数据),而是一套 “流水线式” 的操作 API,目的是让集合处理代码更简洁、高效,尤其是处理大数据量时还能轻松实现并行处理。

2025-12-04 14:13:44 1119

原创 JVM回收垃圾机制

JVM的垃圾回收(Garbage Collection, GC)是自动管理内存的核心机制,通过识别并清理不再使用的对象释放内存空间。其核心目标是优化堆内存的使用效率,减少内存泄漏和程序崩溃的风险。

2025-12-03 21:41:43 712

原创 类的加载机制

核心逻辑:类加载是 JVM 把.class 文件变成 Class 对象(模板)的过程,先加载、后实例化,且只加载一次;关键步骤:加载→验证→准备→解析→初始化(只有主动使用类才触发初始化);核心区别:静态代码块(类加载时执行 1 次)vs 构造方法(实例化时执行 N 次);静态属性(共用)vs 实例属性(独立);实际价值:解决静态相关 bug、理解框架原理、合理设计全局资源加载。

2025-12-02 16:28:30 1432

原创 什么是可重入锁?

其本质是通过 “锁持有计数器” 记录线程获取锁的次数,释放时需对应次数的解锁操作,计数器归 0 后锁才会真正释放,供其他线程竞争。它解决了非可重入锁中 “线程再次请求自身已持有锁时陷入死锁” 的痛点,是 Java 中和的共同核心特性。

2025-12-01 08:34:57 712

原创 垃圾回收算法

垃圾回收的核心是识别可达对象,不同算法在效率、内存碎片、STW 时间上各有取舍。引用计数法简单但有循环引用缺陷,追踪式算法(标记 - 清除 / 复制 / 整理)可解决该问题但有 STW 开销。分代回收是 “因地制宜” 的优化策略,结合了多种算法的优点,是现代 GC 的主流方案。

2025-11-28 18:42:00 499

原创 什么是内存溢出?什么是内存泄漏?

内存泄漏是 “内存占着不用”,核心是引用管理失控,增量泄漏是最隐蔽的 “慢性杀手”,需通过工具追踪引用链解决;内存溢出是 “内存不够用”,核心是需求超过上限,可能由泄漏积累或瞬间大内存申请触发,需结合日志和内存分析定位根源;预防 OOM 的关键是避免泄漏(规范编码 + 定期检测)和优化内存使用(流式处理 + 资源复用),两者缺一不可。

2025-11-27 14:05:42 1482

原创 synchronized的作用是什么?

的核心作用是保证多线程对共享资源的互斥访问,解决线程安全问题。它通过Monitor 锁机制实现原子性、可见性,并间接保证有序性(排除指令重排对同步代码块的影响)。使用方式分为对象锁(实例方法 / 代码块)和类锁(静态方法 / 代码块),可灵活适配不同场景。

2025-11-26 15:17:30 461

原创 什么是线程池?

线程池的核心价值是线程复用,大幅降低线程创建 / 销毁的开销,提升程序性能;线程池通过控制并发线程数量,避免系统因线程过多耗尽资源,增强程序稳定性;线程池是处理高并发、短任务场景的最优方案之一,是并发编程的基础组件。

2025-11-26 13:50:12 439

原创 是什么是垃圾回收机制

垃圾回收的核心算法包括标记 - 清除复制标记 - 整理,现代 GC 常结合分代思想优化性能。不同语言的 GC 实现差异显著,主要体现在回收策略(如 Python 的引用计数 + 分代回收,Java 的分代回收)和性能目标(如 Go 的低延迟)。GC 的性能权衡在于吞吐量延迟和内存占用三者之间,没有完美的 GC,只有适合特定场景的 GC。

2025-11-24 08:47:46 1066

原创 jvm的基本结构

JVM 内存模型:堆、方法区、虚拟机栈等区域的作用、线程共享性、OOM 场景;类加载机制:双亲委派模型、类加载流程、自定义类加载器;执行引擎:JIT 编译、热点代码、GC 算法与收集器;JDK 7 vs JDK 8 内存模型差异:永久代 → 元空间的变化及原因;核心参数:堆、栈、元空间的配置参数,GC 收集器的选择。

2025-11-22 08:43:51 1339

原创 线程池的作用

降低资源消耗:通过线程复用减少创建 / 销毁线程的系统开销。控制并发风险:限制最大线程数,防止系统因线程过多而崩溃。提升响应速度:任务到来时可直接使用空闲线程,无需等待线程创建。便于管理监控:统一管理线程生命周期,支持任务排队、拒绝策略等扩展功能。

2025-11-21 10:10:09 578

原创 什么是多线程死锁,如何预防和解决?

死锁的核心是四个必要条件同时满足,缺一不可。预防死锁的关键是破坏其中至少一个条件(如按序申请资源),是最常用的策略。死锁避免依赖动态判断(如银行家算法),检测与恢复则是 “事后补救” 方案。

2025-11-20 13:55:26 1496

原创 notify()和notifyAll()有什么区别

唤醒在此对象监视器上等待的单个线程(随机选择)。如果有多个线程在等待,只有一个会被唤醒,其余线程继续等待。适用于明确知道只需唤醒一个线程的场景(如单资源分配)。唤醒在此对象监视器上等待的所有线程。所有等待线程会竞争锁,最终只有一个线程能获取锁并执行。适用于需要唤醒所有相关线程的场景(如多资源释放或条件变更)。是 Java 中用于线程间通信的两个方法,均属于。它们的主要区别在于唤醒等待线程的方式和数量。

2025-11-19 13:13:51 201

原创 如何解决线程安全

线程安全问题通常发生在多线程环境下,多个线程同时访问共享资源时可能导致数据不一致或程序崩溃。同步机制可以确保同一时间只有一个线程访问共享资源。

2025-11-19 13:11:56 294

原创 线程的生命周期

线程的生命周期描述了线程从创建到终止的整个过程,通常包括多个状态。方法执行或因异常退出后进入终止状态。此时线程对象仍在内存中,但无法再次启动。线程因某些原因暂时放弃CPU使用权,进入阻塞状态。线程主动进入无限期等待,直到被其他线程显式唤醒。与等待状态类似,但设置了超时时间。

2025-11-17 11:38:31 319

原创 线程、程序、进程的定义以及区别

程序程序是静态的指令和数据的集合,是保存在磁盘上的可执行文件(如.exe.py等),不占用系统资源(如内存、CPU),仅作为 “待执行的蓝图” 存在。例如:你编写的hello.py脚本、电脑里的Chrome.exe文件,未运行时都是程序。进程进程是程序的一次动态执行过程,是系统进行资源分配和调度的基本单位。当程序被加载到内存中运行时,就成为一个进程。每个进程拥有独立的资源(如内存空间、文件句柄、网络连接等),并具有自己的生命周期(创建→运行→暂停→终止)。例如:双击Chrome.exe。

2025-11-17 08:55:59 538

原创 HashMap为什么线程不安全?

对于需要保证线程安全的场景,推荐直接使用ConcurrentHashMap而非通过Collections.synchronizedMap包装HashMap,后者只是对方法调用加同步锁,性能较差。当多个线程同时执行put操作时,若计算的hash值对应同一个桶,可能导致后一个线程的写入覆盖前一个线程的数据。HashMap在插入元素时未加锁,无法保证原子性。HashMap的size属性没有使用volatile修饰,多线程同时进行put/remove操作时,size的可见性无法保证,可能导致读取到过期值。

2025-11-14 08:40:21 168

原创 HashMap和HashTable的区别

修饰,保证多线程环境下的数据一致性,但性能较差。HashMap非线程安全,多线程操作可能导致数据不一致,需额外同步处理(如使用。HashTable的同步机制导致高并发场景下性能较低。HashMap无同步开销,单线程性能更优,可通过。遍历,不支持快速失败(fail-fast)。HashMap允许一个null键和多个null值,设计上更灵活。HashMap的哈希计算优化(如高位异或)减少哈希冲突。接口,但HashMap的API更现代。类(已过时),HashMap继承自。替代HashTable。

2025-11-13 18:45:41 245

原创 Array和ArrayList有什么不一样?

ArrayList提供丰富的方法(如add()、remove()、contains()),支持动态增删元素、自动扩容、集合操作等。ArrayList只能存储对象类型,基本数据类型需通过包装类(如Integer、Character)实现存储。ArrayList是动态数组,属于Java集合框架的一部分,长度可自动增长以适应元素数量的变化。Array访问元素效率高(直接索引),适合固定大小的数据存储。ArrayList在频繁插入或删除元素时可能涉及数组复制,效率较低,但提供了更好的灵活性和便利性。

2025-11-13 18:43:41 237

原创 说说List,Set,Map三者的区别

重复性List允许重复;Set和Map的键不允许重复。顺序List和保留插入顺序;TreeSetTreeMap按排序规则排列;其他实现类不保证顺序。访问方式List通过索引;Set通过元素本身;Map通过键。示例代码片段// 允许重复添加// 重复添加无效// 键重复会覆盖旧值顺序性:List有序;Set通常无序(除等);Map的键无序(除等)。重复性:List允许重复元素;Set和Map的键不允许重复。访问方式:List通过索引;Set通过元素本身;Map通过键访问值。

2025-11-11 08:31:22 589

原创 什么是java面向对象

Java 面向对象的核心是通过 “类与对象” 抽象现实事物,借助封装保证数据安全继承实现代码复用多态提升程序灵活性,最终让代码更贴近人类思维,适配复杂项目的开发与维护需求。

2025-11-07 00:00:00 825

原创 java中的异常包含哪些?

类型父类编译时是否强制处理常见场景运行时异常否程序逻辑错误(可通过代码避免)编译时异常非的Exception是外部环境导致(需显式处理)继承Exception继承运行时异常提醒开发者修复代码逻辑,编译时异常强制开发者处理外部可能的风险。

2025-11-06 00:00:00 752

原创 什么是java序列化?什么情况下使用序列化

Java序列化是指将Java对象转换为字节流的过程,以便将其存储在文件中、通过网络传输或在内存中缓存。反序列化则是将字节流重新转换为Java对象。序列化机制允许对象的状态被保存和恢复,常用于跨平台或跨网络的数据交换。序列化后的字节流可以通过TCP/IP等协议发送,接收方通过反序列化还原对象。任何需要序列化的类都必须实现该接口(标记接口,无方法)。在Web应用中,用户Session对象可能被序列化后存入Redis等缓存服务,以实现跨请求的状态保持。例如,游戏存档、应用配置等场景可通过序列化实现。

2025-11-05 01:00:00 363 2

原创 什么是IO多路复用

IO 多路复用的核心价值是用单线程(或少量线程)高效管理多 IO,通过 “等待 - 通知” 机制避免无效 CPU 消耗和线程开销,是处理高并发 IO 场景的关键技术。

2025-11-04 20:46:44 392

原创 java中的形参与实参的区别

一、主体不同1、实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”。2、形参:不是实际存在变量,又称虚拟变量。二、目的不同1、实参:可以是常量、变量或表达式,无论实参是何种类型的量,才进行函数调用时,都必须具有确定的值,以便把这些值传递给形参。2、形参:定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。三、特点不同1、实参:在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。值在函数调用期间有效,可以参加该函数中的运算。2、形参:形参的本

2025-11-03 03:00:00 1335

原创 了解抽象类和接口的区别

抽象类是用abstract修饰的类,可以包含抽象方法(无实现)和具体方法(有实现)。接口通过interface定义,早期仅能包含抽象方法(Java 8后支持默认方法和静态方法)。抽象类抽象类可包含任意类型的成员变量(常量或变量接口的成员变量默认是(常量),必须初始化。抽象类是 “部分实现的模板”,侧重继承与代码复用;接口是 “纯行为规范”,侧重多实现与跨类行为定义。实际开发中,两者常结合使用(如抽象类实现接口,再让子类继承抽象类)。

2025-11-01 00:00:00 1364

原创 重载和重写的区别的解析

重写是指子类重新定义父类中已有的方法,方法名、参数列表和返回值类型必须完全相同。重写的目的是改变或扩展父类方法的行为,需遵循“两同两小一大”规则:方法名和参数相同;子类返回值类型和抛出的异常小于等于父类;子类访问权限大于等于父类。重载是指在同一个类中,方法名相同但参数列表不同(参数类型、数量或顺序不同)。返回值类型可以相同也可以不同,但不能仅通过返回值类型区分重载方法。重载的目的是提供多个处理不同输入的方法,提高代码的可读性和灵活性。通过合理使用重载和重写,可以提升代码的灵活性和可维护性。

2025-10-31 00:00:00 459

原创 带你基本了解什么是 泛型?

泛型的本质是 “将类型作为参数传递”,让代码更通用、更安全、更简洁。它是现代编程语言(如 Java、C#、Kotlin、TypeScript 等)的重要特性,尤其在集合框架、工具类、通用算法中被广泛使用。

2025-10-30 14:06:09 453

原创 java中Static关键字有什么作用?

修饰方法:为静态方法,属于类本身,可直接用类名调用(无需创建对象),不能被重写(因不依赖实例),且内部不能使用this或super(无对象上下文)。修饰内部类:成为静态内部类,不依赖外部类的实例,可直接通过外部类名访问(如OuterClass.StaticInnerClass),常用于与外部类逻辑相关但无需依赖实例的场景。修饰代码块:为静态代码块,在类加载时执行,且仅执行一次,多个静态代码块按定义顺序执行。修饰变量:为静态变量(类变量),被该类所有实例共享,内存中仅存一份,在类加载时初始化,不依赖对象。

2025-10-29 23:21:30 218

原创 equals与==的区别

用于比较操作,但它们的用途和行为有显著差异,尤其在Java等面向对象语言中。是一个比较操作符,用于比较两个变量的值。对于基本数据类型(如。类中的一个方法,用于比较两个对象的内容是否相等。等),它直接比较它们的值是否相等。对于引用类型(如对象),比较的是两个引用是否指向内存中的同一个对象实例。的行为相同(即比较引用),但许多类(如。方法以实现内容比较。

2025-10-28 17:12:17 189

原创 JDK是什么?JRE是什么?JVM是什么?帮助你快速了解

JDK 是 Java 开发人员用于编写、编译、调试 Java 程序的工具集合。JDK是Java开发工具包,包含编写、编译和运行Java程序所需的核心组件。

2025-10-27 22:23:12 829

空空如也

空空如也

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

TA关注的人

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