自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 什么是UUID,怎么组成的?

UUID(Universally Unique Identifier)是一种128位的标识符,用于在分布式系统中唯一标识信息。其设计目标是保证在时间和空间上的全球唯一性,无需中央注册机构即可生成。

2025-12-12 18:54:35 132

原创 双亲委派的概念

Override// 1. 检查是否已加载Class<?try {// 2. 优先自己加载(打破委派)// 3. 失败后再委派父加载器return c;

2025-12-12 14:47:01 291

原创 session和cookie的区别

当用户首次访问网站时,服务器会创建一个唯一的Session ID,并通过Cookie或URL重写的方式将该ID发送给客户端。客户端在后续请求中会携带这个Session ID,服务器根据ID找到对应的Session数据。服务器在用户第一次访问时生成一个唯一的Session ID,通常是一个长随机字符串。服务器根据请求中的Session ID找到对应的存储区,进行数据的读取或修改。不同的服务器和框架可以配置不同的Session超时时间,常见的是30分钟到几小时不等。

2025-12-12 14:45:20 205

原创 Servlet中的doPost和doGet方法有什么区别,它们在传递和获取参数上有什么区别呢?

对应HTTP的GET请求。POST请求将数据放在请求体中,适合传输敏感或大量数据;GET请求将参数附加在URL后,长度受浏览器限制且参数可见。的参数封装在请求体中,不会直接暴露,适合密码等敏感信息。,避免参数被缓存或记录。受URL长度限制(通常约2048字符),形式,数据暴露在地址栏和服务器日志中。理论上无限制,但实际受服务器配置约束。若同一参数名多次出现(如复选框),使用。需手动解码或配置服务器URI编码。对应HTTP的POST请求,的参数通过URL明文传递,如。两者均需显式处理字符编码。

2025-12-10 15:51:21 316

原创 笛卡尔积是什么

笛卡尔积(Cartesian Product)是集合论中的一种运算,指两个集合中所有有序对的集合。若集合 ( A ) 和集合 ( B ) 进行笛卡尔积运算,结果记为 ( A \times B ),其元素形式为 ( (a, b) ),其中 ( a \in A ),( b \in B )。

2025-12-10 15:49:38 224

原创 Forward(转发)与Redirect(重定向)的区别

【代码】Forward(转发)与Redirect(重定向)的区别。

2025-12-10 15:46:04 243

原创 Servlet的生命周期

Servlet的生命周期由Servlet容器(如Tomcat)管理,主要包括初始化、服务和销毁三个阶段。每个阶段对应特定的方法,开发者可以通过重写这些方法实现自定义逻辑。

2025-12-06 22:02:45 173

原创 POST和GET的区别

选择GET或POST需根据具体需求:GET适合简单、公开的数据获取,POST适合复杂、私密的数据提交。实际开发中应遵循RESTful API设计原则,合理使用这两种方法。

2025-12-04 23:33:24 145

原创 什么是Stream流

进行高效操作(如过滤、映射、排序等)。它不存储数据,而是通过管道(pipeline)对源数据执行一系列惰性计算的中间操作和终端操作。Stream流是Java 8引入的一种处理集合数据的抽象工具,用于以声明式方式对集合(如。Stream流通过链式调用和惰性计算优化性能,尤其适合大数据量或复杂的数据处理流程。

2025-12-03 19:59:57 244

原创 类的加载机制

通过继承类并重写findClass方法,可以实现自定义类加载器。@Override// 从自定义路径加载类的字节码。

2025-12-03 19:57:35 276

原创 JVM性能调优

提升吞吐量、降低延迟、减少内存占用,确保应用在高负载下稳定运行。调优需结合应用特点、硬件资源和JVM机制进行。调整新生代与老年代比例(默认2,即新生代占1/3)。建议初始值与最大值一致,防止运行时调整堆大小引发性能波动。检查老年代占用率、元空间是否不足,或存在大对象分配。调整Eden与Survivor区比例(默认8)。设置初始和最大堆大小,避免动态扩容开销。Java 8+使用元空间替代永久代,通过。)分析对象引用链,定位未释放对象。适用于大堆和低延迟场景,通过。(目标最大停顿时间)

2025-12-01 10:00:53 297

原创 JVM的内存结构

JVM(Java虚拟机)内存结构是Java程序运行时的核心组成部分,分为多个区域,每个区域负责不同的功能。主要分为线程共享区域和线程私有区域。

2025-12-01 09:58:17 374

原创 垃圾回收算法

基础算法定位标记 - 清除:简单但有碎片,适合临时场景;复制算法:高效无碎片但利用率低,适合低存活占比(新生代);标记 - 整理:无碎片高利用率但有移动开销,适合高存活占比(老年代);实际应用逻辑分代收集是基础策略,结合复制 + 标记 - 整理,覆盖大多数场景;分区收集是大堆优化,通过 Region 按需回收,解决大堆停顿问题;选择原则小堆(<4GB):Serial GC / Parallel GC(吞吐量优先);中堆(4~16GB):G1 GC(平衡停顿与吞吐量);

2025-12-01 09:56:48 759

原创 MyBatis 的设计模型

基于责任链模式(Chain of Responsibility Pattern),通过拦截器(Interceptor)对四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)进行扩展。执行器是 MyBatis 的核心调度层,分为简单执行器(SIMPLE)、重用执行器(REUSE)和批处理执行器(BATCH)。封装了 SQL 语句的配置信息(如 ID、参数类型、结果类型、SQL 文本)。解析标签,生成最终可执行的 SQL 语句。

2025-11-27 19:35:26 448

原创 Spring的IoC和DI是什么

IOC是一种设计原则,核心就是将对象的创建、管理(生命周期:创建、初始化、销货)的控制权,从应用程序代码本身转移到Spring容器当中(IOC Container)DI就是实现IOC的具体技术手段,核心是:Spring容器在创建对象的时候,自动将这个对象所依赖的其他对象依赖注入到她里面(注入方式可以是构造器、setter方法等等)IOC:思想 / 原则,将对象的创建、管理控制权从代码转移到 Spring 容器,解耦组件依赖。DI。

2025-11-26 19:21:17 425

原创 什么是反射?

反射的底层依赖JVM的类加载机制,当类被加载的时候,JVM会为每个类生成一个唯一的Class对象(字节码的内存映射),这个对象包含了这个类的所有结构信息(类名、父类、接口、构造器、方法、字段)反射的本质就是通过操作这个Class对象,反相获取类的结构并动态操作,打破了编译器确定类操作的限制。补充:基本数据类型的Class对象比如int.class和包装的TYPE属性比如是说Integer.TYPE是同一个对象,比如int.class == Interger.TYPE结果为true。对象获取成员变量,用于。

2025-11-26 18:59:23 801

原创 Spring 核心注解深度分析

Spring框架的核心幼稚之一是通过注解驱动简化配置,实现组件解耦和功能扩展,注解本质就是元数据标记,Spring容器通过注解解析器识别这些标记,完成组件注册、依赖注入、事务管理等核心功能。

2025-11-21 19:52:47 788

原创 JVM(Java 虚拟机):核心原理、内存模型与调优实践

JVM 的核心是 “内存管理 + 垃圾回收”,掌握其内存模型、GC 原理、类加载机制是调优的基础。依据业务场景(吞吐量 / 低延迟)选择合适的 GC 收集器和参数;避免盲目调优,先通过监控工具定位问题(如 OOM、频繁 GC),再针对性优化;优先优化代码(如避免内存泄漏、减少大对象),再调整 JVM 参数;生产环境建议开启 GC 日志和 OOM 堆快照,便于问题排查。JVM 调优是一个 “迭代优化” 的过程,需结合实际业务压力测试,逐步调整参数,达到最优性能。

2025-11-21 09:04:53 914

原创 线程池的概念

线程池的核心价值是线程复用 + 资源控制,解决了直接创建线程的开销和资源耗尽问题。按任务类型(CPU/IO 密集型)合理配置核心参数;生产环境优先使用,避免Executors;配置有界队列和合理的拒绝策略,防止 OOM;做好监控和优雅关闭,避免线程泄露和数据不一致。

2025-11-21 08:55:29 357

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

摘要:Java中notify()和notifyAll()的主要区别在于唤醒线程的数量和行为。notify()随机唤醒一个线程,适合等待条件相同的场景,但可能引发线程饥饿;notifyAll()唤醒所有线程,确保所有线程都有机会检查条件,但会增大锁竞争开销。二者都需在synchronized块中调用,唤醒后线程需重新获取锁才能执行。核心原则是:不确定时优先使用notifyAll()以避免阻塞风险,明确所有线程任务一致时可使用notify()提升性能。(149字)

2025-11-19 10:05:27 649

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

多线程死锁是指两个或多个线程在执行过程中因争夺资源而造成的一种互相等待的现象,导致这些线程都无法继续执行。互斥条件:资源一次只能被一个线程占用。占有并等待:线程持有至少一个资源,同时等待获取其他被占用的资源。不可剥夺:线程已获得的资源在未使用完之前不能被其他线程强行抢占。循环等待:存在一个线程的循环链,每个线程都在等待下一个线程所占用的资源。

2025-11-18 19:27:56 247

原创 synchronized的作用什么

是 Java 中的关键字,主要用于实现线程同步,确保多线程环境下对共享资源的访问安全。块或方法前,线程会清空工作内存中的变量副本,从主内存重新加载数据;退出时会将修改后的值同步到主内存,从而确保其他线程能立即看到最新值。修饰的代码块或方法在同一时间只能被一个线程执行,确保操作的原子性。通过互斥锁防止指令重排序优化破坏代码的逻辑顺序,确保代码执行顺序与程序顺序一致。需显式指定锁对象(可以是任意对象),灵活控制同步范围。),同一实例的多个线程会竞争同一把锁。),所有实例的线程会竞争同一把锁。

2025-11-18 19:24:59 328

原创 Sleep()和wait()的区别

sleep()属于Thread类,是线程 "自身休眠" 的工具,不涉及锁机制;wait()属于Object类,是 "锁对象" 提供的线程通信机制,必须与锁配合使用。这种类归属的差异,本质上是 "单个线程控制" 与 "多线程协作" 两种设计目标的体现。理解这一点,就能从根本上区分两者的用法和场景。

2025-11-17 08:37:34 395

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

程序 → 进程:程序被加载到内存执行时成为进程,一个程序可以对应多个进程(如多次启动同一个应用)。进程 → 线程:一个进程至少包含一个线程(主线程),可创建多个线程并发执行,线程是进程的 "子任务单元"。

2025-11-14 08:40:13 255

原创 在JAVA多线程有几种方式

当需要创建大量线程时,频繁创建和销毁线程会消耗大量系统资源。线程池通过预先创建一定数量的线程,复用线程执行多个任务,提高性能和资源利用率。方法),通过实现该接口可以定义线程任务,再将任务传递给。类似,但它可以返回任务执行结果,并且能抛出异常。类是 Java 中线程的基础类,通过继承它并重写。方法是线程的入口点,线程启动后会自动执行该方法。包提供的线程池框架实现,核心接口是。适用于需要返回结果的场景,而继承。接口可以获取异步任务的结果。方法可以定义线程执行逻辑。是一个函数式接口(仅含。

2025-11-14 08:37:30 842

原创 HashMap为什么用key作为键

HashMap用 key 作为 “键”,本质是由其“哈希表的底层原理”和“键值对的功能定位”哈希表需要通过一个 “唯一标识” 计算存储位置并解决冲突,key 恰好满足 “唯一性、可哈希、可比较” 的要求;键值对的核心是 “通过标识找数据”,key 是标识,value 是数据,角色分工天然决定了 key 作为 “键” 的必然性。key 是 “定位器”,value 是 “目标数据”,没有定位器,就找不到数据 —— 这就是 HashMap 用 key 作为键的根本原因。

2025-11-13 02:47:33 866

原创 ConcurrentHashMap和Hashtable的区别

ConcurrentHashMap是Hashtable的现代替代方案,通过细粒度锁(或者无锁机制)实现高效并发,同时支持更多原子操作和弱一致性迭代,性能和功能均远抄Hashtable,实际开发汇总,应该有优先使用ConcurrentHashMap处理并发场景。以哈希桶(数组元素)为单位加索:当线程操作某一个桶的时候,只对这个桶的头节点加synchronized锁,其他的桶可以正常访问,同时结合CAS操作(无所机制)优化读操作和简单写入,进一步提升性能。并发度理论上等于哈希桶数量,锁粒度更细,竞争更小。

2025-11-11 22:11:33 337

原创 HashMap深层结构

HashMap的核心是“数组 + 链表 / 红黑树”的混合结构,通过哈希值快速定位元素,用链表和红黑树处理冲突,通过扩容保证效率。其设计充分利用了哈希表的特性,同时通过红黑树优化极端场景下的性能,是 Java 中最常用的集合类之一。

2025-11-11 21:40:45 1001

原创 什么是面向对象

面相对象本质上是一种模块化和抽象化的思维用类抽象同类事物的共性,用对象表示具体个体用封装明确模块边界,隔离变化用继承和组合实现代码复用,减少冗余用多态统一接口,提高扩展性。

2025-11-10 09:00:34 612

原创 HashMap和HashTable的区别

现成不安全,在多线程环境下,并发修改(如果溶蚀进行put和get)可能导致数据不一致或者ConcurrentModificationException。迭代器是安全失败(fail-safe)的其枚举器(Enumerator)不支持并发修改检测,迭代过程中集合的修改不会抛出异常(但可能读取到旧数据)迭代器是快速失败(fail-fast)的,当迭代过程中集合被修改(如添加/删除元素),会立即抛出。线程安全,所有方法都被synchronized修饰,保证了多线程操作的原子性,但是也牺牲了性能。

2025-11-09 23:36:32 304

原创 常用集合以及区别

Java中的集合框架(Java.util包)提供了多种数据结构,用于存储和操作对象的集合,常用集合可以分为List,Set,Map三大体系,它们在功能和特性上有明显的区别。Map用于存储键值对(key-value),键(key)不允许重复,值(value)可以重复,键和值都可以为null(TreeMap键不能为null)Set是无序集合(元素存入顺序与取出顺序不一定一致),不允许存储重复元素(通过equals()和hashCode()判断)1、ArrayList(最常用)3、Vector(古老类,少用)

2025-11-06 20:28:36 746

原创 throw和throws的区别

throw是一个语句,用于在方法内部主动创建并抛出一个具体的异常实例,表示程序在当前位置发生了一场。throws声明可能抛出的异常,不保证一定会抛出。

2025-11-06 19:45:05 353

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

Java 序列化是 Java 语言提供的一套机制,用于将内存中的对象状态转换为可存储或可传输的字节序列,使得对象可以脱离程序运行时的内存环境而存在。反序列化则是其逆过程,将字节序列重新恢复为内存中的对象。这一机制是 Java 实现对象持久化和跨边界数据交换的核心技术。

2025-11-05 11:15:30 587

原创 Java反射

反射式java中动态性的核心实现,但不应滥用框架开发、通用工具等场景适合用反射提升灵活性业务逻辑代码应优化直接调用(性能更好、更容易维护)使用的时候需要注意性能优化(如果缓存反射对象)和安全控制反射的本质是用复杂性换去灵活性那个,合理使用能极大提升代码的扩展性,但过渡使用会导致系统难以维护和调试。

2025-11-05 10:32:59 357

原创 阻塞I/O,非阻塞I/O,I/O复用

I/O(输入/输出)是计算机系统中核心的操作之一,涉及数据在内存与外部设备(如磁盘、网络等等)之间的一些传输,阻塞I/O,非阻塞I/O和I/O复用是三种常见的I/O处理模式,它们在性能和适合场景上有显著差异。定义:通过一个系统调用同时监控多个I/O文件描述符(如socket),当某个或某些描述符就绪(数据可读/可写)时,内核通知应用程序进行处理。定义:当应用程序执行I/O操作时,在数据准备完成前,当前线程会被挂起(阻塞),无法执行其他任务,直到I/O操作完成后才继续执行。

2025-11-03 09:01:35 732

原创 什么是泛型

假如你需要一个装东西的盒子,如果没有泛型思维,你可能需要分别制作装苹果的盒子,装书本的盒子,装手机的盒子,每种盒子只能装一种物品,重复并且低效,而泛型就像一个可以定制的盒子,可以在使用时明确她是装什么东西的盒子,这样复用了盒子的结构,又保证了只能装指定物品,避免混乱。没有泛型的时候,从Object类型集合取数组必须强制转换(比如(int) list.get(0))有泛型后,编译器已经知道了这类型,直接获取就可以了,代码更简洁,不容易出错。的范围(如 “只能是数值类型”“必须实现某个接口”),这就需要。

2025-11-01 11:11:42 766

原创 JDK常用的工具清单

生成自签名证书:keytool -genkeypair -alias mycert -keyalg RSA -validity 365 -keystore mykeystore.jks(有效期365天,存储到mykeystore.jks)查看证书信息:keytool -list -keystore mykeystore.jks(输入密码后查看证书详情)指定输出目录:javadoc -d ./doc *.java(将文档输出到doc文件夹)1.javadoc(生成API文档)2.java(运行)

2025-10-31 10:27:32 318

原创 Static关键字的作用

static成员属于类,而非对象,节省内存(单份拷贝)生命周期与类绑定,独立于对象的创建/销毁访问无需实例化,适合定义工具方法、共享状态等场景一、静态成员的内存模型1.内存分配时机类加载的时候,静态变量/方法会被分配到方法区(JDK8后为元空间),而实例变量存储到堆内存中方法区是线程共享的内存区域,因此静态成员本质上是全局共享资源,所有对象操作的都是同一份数据// 方法区int b = 20;// 堆内存(每个对象独立)2.初始化顺序。

2025-10-31 09:53:05 552

原创 Java中常用的包

Object:所有类的根类,定义了 equals ()、hashCode ()、toString () notify()、getClass()、wait()、clone()Java.lang是属于java的一个核心包,它包含了Java程序运行必不可少的基础类型,这些类不用显式导入就可以在程序中使用(Java会自动导入这个包中的所有类)Java.util是Java标准库中一个非常重要的包,包含了大量实用的工具类,集合框架,日期时间处理,随机数生成等功能。System:提供系统级操作,输入输出,垃圾回收。

2025-10-31 09:09:39 547

原创 MyBatis框架搭建

使用Maven创建一个Web项目在项目的pom.xml文件中,配置项目需要依赖的jar包,将mybatis、日志组件log4j以及MySQL数据库驱动文件配置到pom.xml文件的dependencies节点下。MyBatis框架的核心配置文件主要用于配置连接数据库的相关信息及影响MyBatis框架运行时行为的属性。路径:src/main/java/resources/mapper/SQL映射文件.xml。路径:src/main/java/com/mapper/Mapper接口。

2025-10-28 10:53:48 223

空空如也

空空如也

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

TA关注的人

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