自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 什么是视图?

视图是数据库中的一种虚拟表,其内容由查询定义。与实际的物理表不同,视图不存储数据,而是基于一个或多个表的查询结果动态生成。视图可以简化复杂查询、隐藏敏感数据或提供特定角度的数据展示。通过合理使用视图,可以提升数据库的灵活性和安全性,同时降低应用程序的复杂性。此视图仅显示活跃员工的ID、姓名和部门信息。

2025-12-23 14:09:24 197

原创 SQL之sql注入

SQL注入是一种通过将恶意SQL代码插入输入参数,从而欺骗服务器执行非预期SQL命令的攻击方式。常见于未严格过滤用户输入的Web应用,可能导致数据泄露、篡改或删除。

2025-12-23 14:07:25 337

原创 DROP、DELETE和TRUNCATE的区别?

DROP用于删除数据库对象(如表、视图、索引等),执行后对象及其数据会永久消失,无法回滚。DELETE用于删除表中的数据行,可以指定条件(WHERE子句),支持事务回滚。TRUNCATE用于快速清空表中的所有数据,不记录单行删除操作,无法回滚。

2025-12-18 16:53:06 238

原创 数据库的三大范式是什么?

例如,订单明细表中,若主键是“订单ID”和“产品ID”,但“产品名称”仅依赖于“产品ID”,则不符合2NF。第三范式在满足2NF的基础上,要求非主键字段之间不能存在传递依赖,即非主键字段必须直接依赖于主键。例如,学生表中包含“学号”(主键)、“学院”、“学院电话”,若“学院电话”依赖于“学院”而非直接依赖“学号”,则不符合3NF。解决方法是拆分表,消除传递依赖。例如,一个包含“地址”字段的表,如果地址可以拆分为“省”、“市”、“街道”等子字段,则不符合1NF。解决方法是将“地址”拆分为多个独立的字段。

2025-12-17 18:32:55 382

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

UUID(Universally Unique Identifier)是用于标识信息的128位唯一标识符,标准形式为32个十六进制数字,分为5段并以连字符分隔(如其核心特性是全局唯一性,无需中央注册即可生成。

2025-12-16 08:22:41 270

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

UUID(Universally Unique Identifier)是一种标准化标识符,用于在分布式系统中唯一标识信息。其核心特点是无需中央协调即可生成,且重复概率极低(理论可忽略)。

2025-12-16 08:19:15 210

原创 说一下session的工作原理?

当用户首次访问网站时,服务器会为该用户创建一个唯一的Session ID。Session依赖于Cookie或URL重写机制来传递ID,而Cookie是独立的客户端存储机制。Session更安全,可以存储较大或敏感的数据,但会增加服务器负担。Session通常有一个超时时间,如果用户在指定时间内没有活动,Session会被服务器自动销毁。服务器应该验证Session ID的有效性,防止伪造的ID访问其他用户的Session数据。某些服务器支持Session的持久化,将Session数据存储到数据库或文件中。

2025-12-16 08:16:30 258

原创 Jsp中动态include和静态include的区别

指令,在JSP页面编译阶段直接将目标文件内容合并到当前页面中。目标文件内容成为当前JSP的一部分,共享相同的变量和编译结果。静态include仅支持文本文件(如JSP、HTML),在编译前完成内容合并。适合包含不常变化的公共内容如页眉页脚。标签,在页面被请求时动态包含目标文件内容。目标文件可以是JSP或Servlet,执行结果会被插入到当前页面中。动态include会生成独立的Servlet,各自编译执行。适合包含频繁变动的内容或需要运行时计算结果的场景。动态include使用。静态include使用。

2025-12-13 08:20:43 237

原创 Forward和redirect的区别

是客户端行为,服务器返回新地址(状态码302/301),客户端重新请求。URL地址栏变化,两次独立请求,数据需通过URL参数或会话(Session)传递。效率较低,但支持跨应用跳转。是服务器端行为,请求在服务器内部跳转,客户端无感知。URL地址栏不变,仅服务器内部资源切换。数据可通过请求属性(如。)共享,效率较高,适合同一应用内的页面跳转。

2025-12-11 08:26:25 193

原创 java中重复注解机制是什么?

需要先声明一个容器注解(Container Annotation),用于存储重复的注解实例。容器注解必须包含一个返回注解数组的。

2025-12-11 08:19:54 311

原创 什么是Stream流

Stream是Java 8引入的API,用于以声明式方式处理集合数据(如过滤、映射、排序等)。它允许高效、并行化的操作,无需显式编写循环代码。Stream不存储数据,而是通过操作管道(如filter、map)对数据源(集合、数组等)进行计算。

2025-12-10 14:25:39 294

原创 java中什么是方法引用?

方法引用(Method Reference)是Java 8引入的一种简化Lambda表达式的语法糖。它允许直接通过已有方法的名称来指向该方法,无需编写完整的Lambda实现。方法引用通常用于函数式接口的实例化,使代码更简洁易读。适用于Lambda参数列表中第一个参数作为方法调用者的情况。对象名::实例方法名。

2025-12-10 14:20:03 277

原创 Java中类的加载机制

Java类的加载机制是JVM将类的字节码文件加载到内存,并转换为运行时数据结构的过程。该机制遵循双亲委派模型,确保类的唯一性和安全性。@Override// 自定义加载逻辑// 从文件或网络读取字节码。

2025-12-02 16:16:19 430

原创 jdk1.8新增的类以及常用的方法有哪些?

JDK 1.8引入了许多新特性,主要集中在Lambda表达式、Stream API、新的日期时间API等。这些新增的类和方法显著提升了代码的简洁性和功能性,尤其在集合处理、异步编程和日期时间操作方面。

2025-12-02 16:13:49 303

原创 JVM内存结构

JVM内存结构是Java虚拟机在执行Java程序时划分的多个内存区域,每个区域有特定用途。主要包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。

2025-12-01 08:47:45 377

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

内存溢出指程序在申请内存时,系统没有足够的内存空间供其使用。通常发生在程序试图分配超过系统可用内存的资源时,导致程序崩溃或异常终止。内存泄漏指程序未能释放不再使用的内存,导致系统内存被逐渐耗尽。即使程序终止,泄漏的内存也可能无法被回收。

2025-12-01 08:44:33 277

原创 JVM性能调优

使用工具分析(如GCViewer、GCEasy)识别Full GC频率、停顿时间等问题。)通常设为1:2或1:3。合理设置Eden和Survivor区比例((替代固定值),避免超过容器内存限制触发OOM Killer。缓存对象注意软/弱引用选择,及时清理无引用集合。参数),避免频繁GC。新生代与老年代比例((方法调用阈值触发JIT),热点方法内联(避免大对象直接进入老年代,减少。在Docker/K8s中设置。避免频繁反优化(检查。实时查看各分区使用率。),默认8:1:1。

2025-11-27 18:43:20 257

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

多线程死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象。这些线程被无限期地阻塞,无法继续执行。死锁通常发生在多个线程持有部分资源并等待其他线程释放资源时,形成循环等待的条件。

2025-11-26 16:23:46 421

原创 什么是可重入锁?

可重入锁(Reentrant Lock)是一种同步机制,允许同一个线程多次获取同一把锁而不会导致死锁。这种锁的特点是线程可以重复进入被锁保护的代码块,每次进入都会增加锁的计数,退出时减少计数,直到计数归零才真正释放锁。可重入锁在多线程编程中广泛使用,既保证了线程安全,又提高了代码灵活性。

2025-11-26 16:13:56 321

原创 volatile是什么?可以保证有序性吗?

volatile是 Java 中的关键字,用于修饰变量。其主要作用是确保变量的可见性和禁止指令重排序,但不保证原子性。volatile能保证可见性和部分有序性,但无法替代锁或原子类解决复合操作的线程安全问题。需根据实际需求选择同步机制。

2025-11-25 09:17:25 306

原创 ReentrantLock的作用是什么?

它的核心作用是通过显式加锁和解锁来控制多线程对共享资源的访问,确保线程安全。ReentrantLock 是 Java 并发包()中的一个锁实现类,提供了比。

2025-11-25 09:15:35 409

原创 JVM基本结构

负责加载 Java 类文件(.class)到运行时数据区。类加载过程包括加载、链接(验证、准备、解析)和初始化三个阶段。类加载器采用双亲委派模型,确保类的唯一性和安全性。负责执行字节码指令,包括解释器(逐条解释执行)和即时编译器(JIT,将热点代码编译为本地机器码以提高性能)。自动管理堆内存的分配与回收,通过标记-清除、复制、标记-整理等算法回收无用对象,减少内存泄漏风险。垃圾回收器的行为可通过 JVM 参数调优。提供 Java 代码调用本地(C/C++)库的能力,通过 JNI 实现跨语言交互。

2025-11-21 18:37:47 399

原创 Java中什么是线程池?

线程池是一种多线程处理形式,用于管理多个线程的生命周期、任务分配和资源复用。它通过预先创建一组线程并维护一个任务队列,避免频繁创建和销毁线程带来的性能开销。

2025-11-20 18:43:55 219

原创 Java中synchronized和ReentrantLock的区别

【代码】Java中synchronized和ReentrantLock的区别。

2025-11-19 11:53:23 188

原创 synchronized的作用是什么?

修饰的代码块或方法在同一时间只能被一个线程执行,其他线程必须等待当前线程释放锁后才能进入。这种特性称为互斥锁(Mutex),防止多个线程同时修改共享数据导致数据不一致。保护的代码块或方法在执行过程中不会被其他线程中断,从而保证操作的原子性。例如,对共享变量的“读-改-写”操作可以作为一个不可分割的整体执行。会强制将线程工作内存中的变量刷新到主内存中,确保其他线程能立即看到变量的最新值,避免因缓存不一致引发的可见性问题。是 Java 中的关键字,用于实现线程同步,确保多线程环境下对共享资源的访问安全。

2025-11-18 08:39:47 390

原创 Java中如何解决线程安全

修饰实例方法时锁定当前对象,修饰静态方法时锁定类对象。确保变量的可见性,每次读取都从主内存获取,写入直接刷新到主内存。等,通过CAS(Compare-And-Swap)机制实现无锁线程安全操作,适合计数器等场景。根据具体场景选择合适方案,高并发优先考虑无锁或细粒度锁实现,简单场景可使用。设计时尽量减少共享数据,通过消息传递(如阻塞队列)实现线程间通信。修饰类和字段,确保对象创建后状态不可变,天然线程安全。更灵活的锁机制,支持尝试获取锁、超时等待和公平锁。等通过分段锁或写时复制技术实现高性能线程安全。

2025-11-17 11:40:30 341

原创 线程的生命周期

新建(New)就绪(Runnable)运行(Running)阻塞(Blocked)等待(Waiting)超时等待(Timed Waiting)和终止(Terminated)。不同编程语言(如Java、C++)的实现细节可能略有差异,但核心状态类似。

2025-11-14 12:04:26 317

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

线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程的实际运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。程序是一组指令的有序集合,用于实现特定功能或解决特定问题。程序以文件形式存储在磁盘上,是静态的代码和数据集合,尚未被加载到内存中执行。进程是程序的执行实例,是操作系统进行资源分配和调度的基本单位。进程包含程序代码、数据、堆栈以及操作系统分配的资源(如内存、文件句柄等)。每个进程拥有独立的内存空间和系统资源。

2025-11-13 18:54:21 315

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

HashMap内部使用数组+链表/红黑树结构存储数据,多线程操作可能破坏链表或树的完整性。多个线程同时修改可能导致数据丢失或覆盖。专为并发设计的实现,采用分段锁(JDK7)或CAS+synchronized(JDK8+),推荐作为首选替代方案。早期线程安全实现,所有方法使用synchronized修饰,性能低下,已不推荐使用。在扩容时,多线程可能导致Entry链表形成环形结构,调用get()时出现无限循环。两个线程同时put时,若计算出的数组索引相同,可能出现后写入的值覆盖前一个值。

2025-11-12 12:29:20 232

原创 Java中HashMap深层结构

HashMap在Java中基于数组和链表(或红黑树)实现,主要存储键值对(Entry或Node)。默认初始容量为16,负载因子为0.75,当元素数量超过容量与负载因子的乘积时触发扩容。HashMap非线程安全,多线程环境下可能导致循环链表(JDK1.7头插法)或数据丢失(JDK1.8尾插法)。线程安全替代方案包括。),以提高查询效率(O(n)→O(log n))。当桶中元素减少到6个时,红黑树退化为链表。当哈希冲突导致同一桶中的元素超过8个时,链表会转换为红黑树(数组,每个数组位置称为桶(bucket)。

2025-11-12 12:28:04 171

原创 Java中HashMap和HashTable的区别

HashMap允许键和值为null,但只能有一个null键。HashTable不允许键或值为null,否则会抛出。HashMap在单线程环境下性能更高,因为无需同步开销。HashTable的同步机制会导致多线程竞争时性能下降。HashMap默认初始容量为16,扩容时容量变为2的幂次方。HashTable默认初始容量为11,扩容时容量变为。HashMap是非线程安全的,多个线程同时操作可能导致数据不一致。HashTable是线程安全的,内部方法使用。替代HashTable,因其分段锁机制性能更优。

2025-11-10 08:52:12 311

原创 在Java中什么是HashMap

HashMap 通过哈希函数将键(key)映射到哈希表的某个位置(桶,bucket)。当插入或查找数据时,计算键的哈希值,定位到对应的桶。如果多个键的哈希值相同(哈希冲突),HashMap 使用链表或红黑树(Java 8 及以后)存储冲突的键值对。接口,基于哈希表的数据结构存储键值对(key-value pairs)。HashMap 允许使用。HashMap 是 Java 集合框架的一部分,位于。作为键或值,并且不保证元素的顺序。

2025-11-10 08:48:34 259

原创 List、Set、Map 的区别

【代码】List、Set、Map 的区别。

2025-11-07 08:39:13 313

原创 Java中throw与throws区别

用于方法签名中,声明该方法可能抛出的异常类型。调用者需要处理这些异常或继续向上声明。是一个关键字,用于在代码块中显式抛出异常对象。通常用于逻辑判断后主动触发异常。都与异常处理相关,但用途和语法不同。用于声明方法可能抛出的异常类型。用于手动抛出一个异常实例,

2025-11-06 13:49:23 242

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

Java允许通过继承Exception(检查型)或(非检查型)创建自定义异常。// 检查型自定义异常// 非检查型自定义异常。

2025-11-05 08:40:47 395

原创 什么是Java序列化?什么情况下需要使用序列化

Java序列化是将对象转换为字节流的过程,以便存储到文件、数据库或通过网络传输。反序列化则是将字节流重新转换为对象。序列化机制允许对象的状态被持久化或跨平台传递。

2025-11-04 08:28:17 158

原创 Java IO流的分类

Java的IO流设计采用了装饰器模式,通过组合不同流实现灵活的功能扩展。

2025-11-03 09:38:40 236

原创 Java中实参和形参的区别

形参(形式参数)是方法或函数声明时定义的变量,用于接收外部传入的值。void printNumber(int num) { // num是形参实参(实际参数)是调用方法时传递给形参的具体值或变量。// value是实参。

2025-11-01 10:44:09 378

原创 Java中重载与重写的区别

重载(Overload)在同一个类中,多个方法拥有相同名称但参数列表不同(参数类型、数量或顺序不同)。返回值类型可相同也可不同。重写(Override)子类重新定义父类中已有的方法,方法名、参数列表和返回值类型必须完全相同。访问修饰符不能比父类更严格。参数列表:重载必须不同,重写必须相同返回类型:重载可修改,重写需兼容(子类返回类型≤父类)异常处理:重载无限制,重写不能抛出更宽泛的检查异常访问权限:重载无限制,重写不能降低访问权限。

2025-10-31 08:29:18 295

原创 java中如何实现字符串的反转

递归方法通过逐步截取子串实现反转,适用于学习递归场景。通过将字符串转换为字符数组,交换首尾字符实现反转。的用法类似,但它是线程安全的,性能略低。根据需求选择合适的方法,优先考虑。方法,可直接反转字符串。

2025-10-30 13:48:10 229

空空如也

空空如也

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

TA关注的人

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