Java中的深拷贝与浅拷贝
什么是拷贝
在Java中,拷贝是指创建一个对象的副本。拷贝主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。理解这两种拷贝的区别对于编写正确的Java程序非常重要,特别是在处理对象引用时。
浅拷贝(Shallow Copy)
浅拷贝是指创建一个新对象,然后将原始对象的所有字段值复制到新对象中。如果字段是基本类型,则直接复制其值;如果字段是引用类型,则复制引用但不复制引用的对象。因此,原始对象和副本对象将共享引用类型的字段。
浅拷贝的实现方式
在Java中,实现浅拷贝有几种方式:
-
使用clone()方法:Object类提供了clone()方法,可以实现浅拷贝
-
使用构造方法:通过构造方法复制每个字段
-
使用拷贝工厂方法
class Department implements Cloneable {private String name;public Department(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Employee implements Cloneable {private String name;private Department department;public Employee(String name, Department department) {this.name = name;this.department = department;}public String getName() {return name;}public Department getDepartment() {return department;}public void setName(String name) {this.name = name;}public void setDepartment(Department department) {this.department = department;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class ShallowCopyExample {public static void main(String[] args) throws CloneNotSupportedException {Department department = new Department("IT");Employee original = new Employee("John", department);Employee cloned = (Employee) original.clone();System.out.println("Original: " + original.getName() + " - " + original.getDepartment().getName());System.out.println("Cloned: " + cloned.getName() + " - " + cloned.getDepartment().getName());// 修改克隆对象的departmentcloned.getDepartment().setName("HR");System.out.println("\nAfter modifying cloned object:");System.out.println("Original: " + original.getName() + " - " + original.getDepartment().getName());System.out.println("Cloned: " + cloned.getName() + " - " + cloned.getDepartment().getName());}
}
输出结果:
Original: John - IT
Cloned: John - ITAfter modifying cloned object:
Original: John - HR
Cloned: John - HR
可以看到,修改克隆对象的department后,原始对象的department也被修改了,这是因为它们引用的是同一个Department对象。
深拷贝(Deep Copy)
深拷贝是指创建一个新对象,然后递归地复制原始对象的所有字段。对于引用类型的字段,不仅复制引用,还会创建引用对象的新副本。因此,原始对象和副本对象完全独立,互不影响。
深拷贝的实现方式
实现深拷贝有几种常见方法:
-
重写clone()方法:在clone()方法中手动复制所有引用类型的字段
-
使用序列化:将对象序列化为字节流,然后再反序列化为新对象
-
使用拷贝构造方法:创建接受原对象并复制所有字段的构造方法
-
使用第三方库:如Apache Commons Lang的SerializationUtils
方法1:重写clone()方法
class Department implements Cloneable {private String name;public Department(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Employee implements Cloneable {private String name;private Department department;public Employee(String name, Department department) {this.name = name;this.department = department;}public String getName() {return name;}public Department getDepartment() {return department;}public void setName(String name) {this.name = name;}public void setDepartment(Department department) {this.department = department;}@Overrideprotected Object clone() throws CloneNotSupportedException {Employee cloned = (Employee) super.clone();cloned.department = (Department) department.clone(); // 深度拷贝departmentreturn cloned;}
}public class DeepCopyExample1 {public static void main(String[] args) throws CloneNotSupportedException {Department department = new Department("IT");Employee original = new Employee("John", department);Employee cloned = (Employee) original.clone();System.out.println("Original: " + original.getName() + " - " + original.getDepartment().getName());System.out.println("Cloned: " + cloned.getName() + " - " + cloned.getDepartment().getName());// 修改克隆对象的departmentcloned.getDepartment().setName("HR");System.out.println("\nAfter modifying cloned object:");System.out.println("Original: " + original.getName() + " - " + original.getDepartment().getName());System.out.println("Cloned: " + cloned.getName() + " - " + cloned.getDepartment().getName());}
}
输出结果:
Original: John - IT
Cloned: John - ITAfter modifying cloned object:
Original: John - IT
Cloned: John - HR
方法2:使用序列化实现深拷贝
import java.io.*;class Department implements Serializable {private String name;public Department(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}class Employee implements Serializable {private String name;private Department department;public Employee(String name, Department department) {this.name = name;this.department = department;}public String getName() {return name;}public Department getDepartment() {return department;}public void setName(String name) {this.name = name;}public void setDepartment(Department department) {this.department = department;}public Employee deepCopy() throws IOException, ClassNotFoundException {// 将对象写入字节数组ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);oos.flush();// 从字节数组读取对象ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (Employee) ois.readObject();}
}public class DeepCopyExample2 {public static void main(String[] args) throws IOException, ClassNotFoundException {Department department = new Department("IT");Employee original = new Employee("John", department);Employee cloned = original.deepCopy();System.out.println("Original: " + original.getName() + " - " + original.getDepartment().getName());System.out.println("Cloned: " + cloned.getName() + " - " + cloned.getDepartment().getName());// 修改克隆对象的departmentcloned.getDepartment().setName("HR");System.out.println("\nAfter modifying cloned object:");System.out.println("Original: " + original.getName() + " - " + original.getDepartment().getName());System.out.println("Cloned: " + cloned.getName() + " - " + cloned.getDepartment().getName());}
}
输出结果与上一个相同:
Original: John - IT
Cloned: John - ITAfter modifying cloned object:
Original: John - IT
Cloned: John - HR
浅拷贝与深拷贝的比较
特性 | 浅拷贝 | 深拷贝 |
---|---|---|
基本类型字段 | 复制值 | 复制值 |
引用类型字段 | 复制引用(共享对象) | 递归复制对象(不共享对象) |
实现复杂度 | 简单(通常只需调用super.clone) | 复杂(需要处理所有引用类型字段) |
性能 | 较高(复制较少) | 较低(需要复制更多对象) |
对象独立性 | 低(引用类型字段会相互影响) | 高(完全独立) |
如何选择拷贝方式
选择浅拷贝还是深拷贝取决于具体需求:
-
使用浅拷贝的情况:
-
对象的所有字段都是基本类型
-
引用类型字段是不可变的(如String)
-
你确实需要共享某些对象的状态
-
-
使用深拷贝的情况:
-
对象包含可变引用类型字段
-
你需要完全独立的副本
-
副本的修改不应影响原始对象
-
注意事项
-
clone()方法的限制:
-
需要实现Cloneable接口,否则会抛出CloneNotSupportedException
-
clone()方法是protected的,如果要在其他包中调用,需要重写为public
-
深拷贝实现需要确保所有相关类都正确实现了clone()
-
-
序列化的限制:
-
所有相关类都必须实现Serializable接口
-
序列化性能较低,不适合频繁拷贝的场景
-
某些特殊对象(如线程)无法通过序列化正确拷贝
-
-
循环引用问题:
-
在深拷贝时,如果对象图中有循环引用,需要特别处理,否则可能导致栈溢出
-
最佳实践
1.考虑使用拷贝构造方法或拷贝工厂方法替代clone():
public Employee(Employee other) {this.name = other.name;this.department = new Department(other.department);
}
2.对于复杂的对象图,考虑使用第三方库如Apache Commons Lang的SerializationUtils.clone():
Employee cloned = SerializationUtils.clone(original);
3.明确文档化你的拷贝行为,让使用者知道是浅拷贝还是深拷贝。
相关文章:
Java中的深拷贝与浅拷贝
什么是拷贝 在Java中,拷贝是指创建一个对象的副本。拷贝主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。理解这两种拷贝的区别对于编写正确的Java程序非常重要,特别是在处理对象引用时。 浅拷贝(Shallow Copy) 浅拷贝是指创建…...
springboot AOP中,通过解析SpEL 表达式动态获取参数值
切面注解 import com.bn.document.constants.FmDeptCatalogueConstants;import java.lang.annotation.*;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface FmDeptCatalogueAopAnnotation {/*** 权限类型*/FmDeptCatalogueConstants value();/…...
【论信息系统项目的合同管理】
论信息系统项目的合同管理 论文要求写作要点正文前言一、合同的签订管理二、合同履行管理三、合同变更管理四、合同档案管理五、合同违约索赔管理结语 论文要求 项目合同管理通过对项目合同的全生命周期进行管理,来回避和减轻可识别的项目风险。 请以“论信息系统项…...
redis持久化方式
一、RDB redis database:快照,某一时刻将内存中的数据,写入磁盘中生成1个dump.rdb文件RDB的触发方式: 手动触发:save(阻塞主进程,阻塞其它指令,保证数据一致性)、bgsave…...
free void* 指令
https://stackoverflow.com/questions/2182103/is-it-ok-to-free-void free(ptr) 仅释放指针指向的内存,不会修改指针变量本身的值。调用后,ptr 仍然指向原来的地址(称为 "悬空指针"),但该地址对应的内存已…...
ADS1220高精度ADC(TI)——应用 源码
文章目录 德州仪器ADS1220概述资料引脚&封装布线寄存器配置寄存器0(00h)配置寄存器1(01h)配置寄存器2(02h)配置寄存器3(03h) 连续转换流程驱动源码ads1220.cads1220.h 德州仪器A…...
mysql-Java手写分布式事物提交流程
准备 innodb存储引擎开启支持分布式事务 set global innodb_support_axon分布式的流程 详细流程: XA START ‘a’; 作用:开始一个新的XA事务,并分配一个唯一的事务ID ‘a’。 说明:在这个命令之后,所有后续的SQL操…...
红黑树:数据世界的平衡守护者
在 C 算法的神秘森林里,红黑树是一棵充满智慧的 “魔法树”。它既不像普通二叉搜索树那样容易失衡,也不像 AVL 树对平衡要求那么苛刻。作为 C 算法小白,今天就和大家一起深入探索红黑树的奥秘,看看它是如何成为数据世界的平衡守护…...
哈夫曼树完全解析:从原理到应用
目录 一、核心概念 二、构造全流程解析 三、编码生成机制 四、C语言实现关键代码 五、核心特性深度解读 六、现代应用场景 七、压缩实战演示 一、核心概念 哈夫曼树(最优二叉树)是带权路径长度(WPL)最短的树形结构&#x…...
如何在 Windows 命令提示符中创建多个文件夹和多个文件
如何在 Windows 命令提示符中创建多个文件夹和多个文件 虽然大多数用户习惯使用 Windows 图形界面来创建文件夹,但如果你需要一次性创建多个文件夹或文件,如同在类Unix系统中可以使用mkdir和touch命令一样,windows下也有创建目录和文件的对应…...
【Java】Spring的声明事务在多线程场景中失效问题。
大家都知道Spring的声明式事务在多线程当中会失效,来看一下如下案例。 按照如下方式,b()方法抛出异常,由于父子线程导致事务失效,a()会成功插入,但是b()不会。 因此成功插入一条数据,事务失效。 Component public class UserServ…...
多平台图标设计与管理的终极解决方案
IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件,专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性,成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...
【搭建Node-RED + MQTT Broker实现AI大模型交互】
搭建Node-RED MQTT Broker实现AI大模型交互 搭建Node-RED MQTT Broker实现AI大模型交互一、系统架构二、环境准备与安装1. 安装Node.js2. 安装Mosquitto MQTT Broker3. 配置Mosquitto4. 安装Node-RED5. 配置Node-RED监听所有网络接口6. 启动Node-RED 三、Node-RED流程配置1. …...
小结: js 在浏览器执行原理
浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现,以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析: ------------------- ------------------- -----------…...
C++核心编程--2 引用
引用就是给变量起别名,操作引用就等于操作原始变量。 2.1 引用基本用法 int var 10; int & r_var var; 2.2 注意事项 声明时必须初始化不允许更改引用指向的原始变量 2.3 引用作为函数参数传递 简化指针修饰函数参数 2.4 引用作为函数返回值 不要返回…...
音频/AI/BLE/WIFI/玩具/商业等方向的论坛网站总结
我爱音频网 我爱音频网 - 我们只谈音频,丰富的TWS真无线蓝牙耳机拆解报告 (52audio.com) 中国人工智能学会 中国人工智能学会 (caai.cn) AIIA人工智能网 https://www.aiiaw.com/ 世界人工智能论坛 世界人工智能论坛 - (amtbbs.org) 36氪 36氪_让一部分人先…...
告别碎片化!MCP 带来 AI Agent 开发生态的革命性突破
引言: 在当今的智能客服系统开发中,开发者常常面临一个棘手的挑战:需要整合用户的 CRM 数据、知识库和实时聊天记录。然而,由于缺乏统一的标准,每个团队都不得不手动实现这些集成。这不仅延长了开发周期,还…...
centos7部署mysql5.7
1.下载mysql的官方yum源 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2.安装yum源 yum -y install mysql57-community-release-el7-11.noarch.rpm3.安装秘钥文件 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-20224.安装mysql5.7…...
linux dbus
Linux D-Bus(Desktop Bus)是一种进程间通信(IPC)机制,主要用于Linux桌面环境和系统服务之间的消息传递。它允许不同的应用程序或系统组件以高效、安全的方式相互通信,是现代Linux桌面(如GNOME、KDE)的核心基础设施之一。 1. D-Bus 的核心概念 消息总线(Message Bus):…...
计量——异方差的检验及其修正
目录 1.异方差的检验 1 BP检验 2white检验 2.异方差的修正 1.异方差的检验 1 BP检验 选择检验方法:BP BP检验的实际步骤(非机器): 1.y对所有x进行回归,得到残差u。计算残差的平方u^2 2.u^2对所有x进行回归&#…...
操作系统学习笔记第3章 内存管理(灰灰题库)
1. 单选题 某页式存储管理系统中,主存为 128KB,分成 32 块,块号为 0、1、2、3、…、31。某作业有 5 块,其页号为 0、1、2、3、4,被分别装入主存的 3、8、4、6、9 块中。有一逻辑地址为 [3, 70](其中方括号中…...
vue3项目中使用CanvasEditor开箱即用(组件的形式,组件封装好了)
canvas-editor-vue 这是canvas-editor项目的vue版本,我封装成组建了,当然了这是个已经把canvas-editor封装好的的Vue项目 项目地址GitHub地址:GitHub - aini-aini/canvas-editor-vue: this is a project than can be used in vue project as Componentthis is a project than…...
人体肢体工作识别-一步几个脚印从头设计数字生命——仙盟创梦IDE
人体肢体识别是借助计算机视觉、传感器等技术,对人体各肢体的位置、动作、姿态等进行检测与分析的技术。其在医疗健康、智能交互、运动训练、安全监控等多个领域具有重要价值, 示例代码 import cv2 import mediapipe as mp import numpy as np import c…...
【重磅】配电网智能软开关和储能联合规划
目录 1 主要内容 目标函数 数据说明 节点系统图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《具有源荷不平衡特性的配电网智能软开关和储能联合规划》部分模型,未考虑聚类分析和分布鲁棒部分,就智能软开关和储能联合规划部分进行了…...
实验6 电子邮件
实验6 电子邮件 1、实验目的 理解电子邮件系统基本结构 理解客户端和服务器端,以及服务器之间的通信 分析理解SMTP,POP3协议 2、实验环境 硬件要求:阿里云云主机ECS 一台。 软件要求:Linux/ Windows 操作系统 3、实验内容…...
NHANES指标推荐:OBS
文章题目:Association between oxidative balance score and all-cause and cancer-specific mortality among cancer survivors DOI:10.3389/fimmu.2025.1541675 中文标题:癌症幸存者氧化平衡评分与全因死亡率和癌症特异性死亡率之间的关联 …...
python-修改图片背景色
在Python中,可以使用图像处理库(如OpenCV或Pillow)来修改图片的背景色。通常,修改背景色的流程包括以下步骤: 1、对图片进行分割,识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...
数据结构与算法--顺序表--单链表
一 顺序表 需要指向存储位置的基地址分配一段连续的内存用length记录实际的元素的个数,也即顺序表的长度,因为顺序表是允许删除和插入元素的不需要定义数组 1.1 普通结构体数组实现版本,实现白色的点以一定的步长移除画面,大量fo…...
MATLAB安装全攻略:常见问题与解决方案
MATLAB安装常见问题与解决方案 一、系统兼容性验证 安装前需确认操作系统满足MATLAB版本要求: Windows 10版本1903及以上(64位)macOS Monterey 12.6及以上Ubuntu 22.04 LTS及以上 验证命令示例: # Linux系统验证 lsb_release…...
constexpr 关键字的意义(入门)
author: hjjdebug date: 2025年 05月 15日 星期四 16:03:33 CST description: constexpr 关键字的意义(入门) constexpr 是c11 引入的一个关键字, 代表了一种属性. 文章目录 1. constexpr 修饰的变量, 在编译期间就可以得到其数值.2. constexpr 修饰的函数, 可以在编译期间被调…...
aptitude 深度教程:从基础到生产实践
目录 一、aptitude 基础:核心概念与环境准备 1.1 aptitude 是什么? 1.2 安装与环境配置 二、aptitude 核心操作:从命令行到交互式界面 2.1 命令行基础操作 2.2 交互式界面(TUI)入门 三、高级功能:依赖管理与版本控制 3.1 依赖冲突解决实战 3.2 版本锁定与降级 3…...
嵌入式开发学习日志(数据结构--双链表)Day21
一、双链表 1.定义 双向链表是在单链表的每个结点中,再设置一个指向其钱去节点的指针域。 2、声明文件 3、创建表头 4、头插 5、 遍历 6、尾插、 7、指定插 8、查找 9、修改 10.、删除 11、逆序 12、销毁链表 13、main.c 三、扩展:工程管理工具&#…...
抢购Python代码示例与技术解析
引言:抢购系统的技术挑战 在当今电子商务高度发达的时代,抢购活动已成为各大电商平台吸引用户的重要手段。然而,高并发、低延迟的抢购场景对系统设计提出了严峻挑战。本文将提供一个完整的Python抢购代码示例,并深入分析其技术实…...
undefined reference to CPUAllocatorSingleton::instance
它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量,但没有提供它的定义。 这个错误是链接器无法找到 CPUAllocatorSingleton::instance 的定义。它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量,但没有提供它的定…...
【c语言】动态内存分配
文章标题 一、为什么要进行动态内存管理二、malloc和free2.1. malloc2.2. free2.3. 举例 三、calloc和realloc3.1. calloc3.2. realloc 四、常见的动态内存错误4.1. 对NULL指针的解引用操作4.2. 对动态开辟空间的越界访问4.3. 对非动态开辟内存使用free释放4.4. 使用free释放⼀…...
深入理解JavaScript中的闭包:原理、应用与常见问题
引言 闭包(Closure)是JavaScript中一个既强大又容易让人困惑的概念。理解闭包对于成为一名优秀的JavaScript开发者至关重要。本文将深入探讨闭包的工作原理、实际应用场景以及常见问题,帮助你彻底掌握这一重要概念。 什么是闭包? 闭包是指那些能够访问…...
IPLOOK | 2025 MVNOs 世界大会:从Wi-Fi通话到卫星覆盖
2025 MVNOs 世界大会于5月12日至14日在奥地利维也纳举行,汇聚了来自50多个国家的550余位行业领袖,共同探讨移动虚拟网络运营商(MVNO)领域的变革趋势。本届大会聚焦数字化转型、技术创新与战略合作,其中IPLOOK凭借其创新…...
为什么elasticsearch配置文件JVM配置31G最佳
Elasticsearch的JVM堆内存配置为32GB被视为最佳实践,主要基于以下综合技术原理和性能优化考量: 1. JVM指针压缩机制优化内存效率 当堆内存≤32GB时,JVM启用对象指针压缩(Compressed Ordinary Object Pointers, COOP&#…...
单片机开发软件
目录 纯编码 vscode Ardunio Keil 1. 集成化开发环境(IDE) 2. 多架构芯片支持 3. 高效的代码生成与优化 4. 强大的调试与仿真功能 5. 丰富的库函数与生态系统 6. 教育与企业级适用性 典型应用场景 半编码半图形化 STM32CUBEIED 1. 图形化配置…...
Java随机生成邀请码 (包含字母大小写+数字)
前言: 目前我们生成的是6位包含数字和大小写字母的随机邀请码, 并且代码中已经有了处理冲突的机制确保了邀请码的唯一性如(①生成随机邀请码后会检查数据库中是否已存在②如果存在冲突,会尝试最多10次重新生成③如果多次尝试仍失败,会使用"U"用户ID派生的…...
mybatis-plus配置逻辑删除
在实体类中标记软删除字段使用注解 TableLogic 标记该字段为软删除字段 import com.baomidou.mybatisplus.annotation.*;public class YourEntity {// ...其他字段TableLogicprivate Integer isDeleted;// getter/setter }yml配置 # 逻辑已删除值 logicDeleteValue: 2 # 逻辑…...
第二十五天打卡
常见报错类型 try-except-else-finally 语句 首先执行try语句,若正确直接执行else语句 若try语句发生错误,则判断错误类型,执行错误类型对应的except语句,不执行else语句 finally语句无条件执行,多用于资源保存&…...
JESD204 ip核使用与例程分析(一)
JESD204 ip核使用与例程分析(一) JESD204理解JESD204 与JESD204 PHY成对使用原因JESD204B IP核JESD204B IP核特点JESD204B IP核配置第一页第二页第三页第四页JESD204 PHY IP核配置第一页第二页JESD204理解 JESD204B是一种针对ADC、DAC设计的传输接口协议。此协议包含四层, …...
Synchronized详解及高频面试问答
目录 JVM简述 Synchronized详解及面试高频问答 而synchronized是什么,可以解决什么问题? synchronized怎么使用? 锁升级升级了什么? 为什么要这样做锁升级? 锁升级的过程是怎样的?为什么会有偏向锁&…...
【LLIE专题】基于码本先验与生成式归一化流的低光照图像增强新方法
GLARE: Low Light Image Enhancement via Generative Latent Feature based Codebook Retrieval(2024,ECCV) 专题介绍一、研究背景二、GLARE方法阶段一:正常光照代码本学习(Normal-Light Codebook Learning)…...
26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述
26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述 文章目录 26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述1.1 计算机的发展1.2 计算机硬件和软件1.2.1 计算机硬件的基本组成1.2.2 各个硬件的工作原理1.2.3 计算机软件1.2.4 计算机系统的层次结构1.2.5 计算机系统…...
Linux云计算训练营笔记day08(MySQL数据库)
Linux云计算训练营笔记day08(MySQL数据库) 目录 Linux云计算训练营笔记day08(MySQL数据库)数据准备修改更新update删除delete数据类型1.整数类型2.浮点数类型(小数)3.字符类型4.日期5.枚举: 表头的值必须在列举的值里选择拷贝表复…...
从基础到实习项目:C++后端开发学习指南
在当今技术快速迭代的背景下,后端开发作为软件工程的核心支柱持续发挥着关键作用。C凭借其卓越的性能表现和系统级控制能力,依然是构建高性能后端服务的首选语言之一。本文将系统性地解析现代C后端开发的核心技术体系,包括从语言特性精要到架…...
jedis+redis pipeline诡异的链接损坏、数据读取异常问题解决
文章目录 问题现象栈溢出(不断的重连)读取超时未知响应尝试读取损坏的链接读取到的数据和自己要读的无关,导致空指针、类型转换错误,数据读取错乱 问题写法问题分析修复注意点 问题现象 栈溢出(不断的重连)…...
十、HQL:排序、联合与 CTE 高级查询
作者:IvanCodes 日期:2025年5月15日 专栏:Hive教程 Apache Hive 作为大数据领域主流的数据仓库解决方案,其查询语言 HQL (Hive Query Language) 是数据分析师和工程师日常工作的核心。除了基础的 SELECT-FROM-WHERE,HQ…...