当前位置: 首页 > news >正文

Java 深拷贝全面解析

1. 引言

在 Java 编程中,对象之间的复制是一个常见的需求。根据复制的深度不同,我们可以将复制分为浅拷贝和深拷贝。本文将深入探讨 深拷贝(Deep Copy) 的概念、应用场景、具体实现方法及其优缺点,并提供一些实用的建议和注意事项。


2. 深拷贝的定义

深拷贝(Deep Copy) 是指创建一个新的对象,并且递归地复制该对象中的所有属性,包括其引用类型的属性。这意味着新对象与其副本之间没有任何共享的数据,即原始对象及其副本各自拥有独立的一份数据。如果原始对象中包含其他对象的引用,则这些被引用的对象也会被复制,而不是简单地复制引用。

例如,如果你有一个 Person 对象,其中包含一个 Address 对象,那么深拷贝不仅会复制 Person 对象本身,还会复制 Address 对象,确保两个 Person 对象中的 Address 是完全独立的。

3个 🌰🌰🌰 帮助理解:

  • 1: 日常生活中的例子
    想象你有一个装满照片的相册,这些照片是你珍贵的记忆。如果你想给家人也准备一本一模一样的相册,你会怎么做?最简单的方法是去复印店,让他们帮你一张张地复印所有的照片,然后重新装订成一个新的相册。这就是深拷贝:你得到了一个全新的、独立的相册,任何对新相册的修改都不会影响原来的相册。
  • 角度 2: 文件系统的比喻
    考虑一下计算机文件系统。当你复制一个文件夹时,操作系统不仅会复制文件夹本身,还会递归地复制文件夹内的所有文件和子文件夹。这种方式确保了新文件夹和原文件夹之间没有任何共享的内容,你可以自由地修改新文件夹中的文件,而不会影响到原始文件夹。这也是深拷贝的概念:递归地复制所有内容,确保完全独立。
  • 角度 3: 图书馆借阅系统
    假设你是一个图书馆管理员,有读者想要借阅一本书。为了方便其他读者也可以阅读这本书,你可以选择为每个读者制作一份完全相同的副本。这些副本是独立的,读者可以在上面做笔记、画线,而不会影响到其他读者手中的副本。这就是深拷贝:每个副本都是独立的,互不影响。

3. 使用背景与应用场景

工业界的常见使用场景
  1. 避免修改影响

    • 在多用户系统或多人协作环境中,为了避免对共享对象的修改影响到其他用户或模块,通常需要使用深拷贝来确保每个用户或模块都有自己的独立副本。
  2. 多线程环境

    • 在并发编程中,多个线程可能需要操作相同的数据结构。为了避免线程间的干扰,可以为每个线程创建数据的深拷贝,确保线程安全。
  3. 数据备份与恢复

    • 在进行复杂计算或状态管理时,保存某个时刻的数据快照非常重要。通过深拷贝,可以在不改变原始数据的情况下保存当前状态,以便之后能够恢复到这个状态。
  4. 安全传递数据

    • 当你需要将数据传递给另一个组件或模块,但又不希望接收方能够修改你的原始数据时,可以通过深拷贝来实现这一点,确保数据的安全性。
  5. 缓存机制

    • 在某些缓存实现中,为了防止缓存中的数据被意外修改,通常会对缓存项进行深拷贝,确保缓存中的数据与实际数据保持一致。

4. 具体使用方式

方法 1: 使用构造函数或方法

通过编写一个接收另一个对象作为参数的构造函数或方法来实现深拷贝。这种方式需要手动为每个成员变量赋值,特别是对于复杂对象,还需要递归地调用其深拷贝方法。

public class Person {private String name;private Address address;// 构造函数public Person(String name, Address address) {this.name = name;this.address = new Address(address); // 确保 Address 也有深拷贝机制}// 深拷贝构造函数public Person(Person other) {this.name = other.name; // 基本类型直接赋值this.address = new Address(other.address); // 复杂类型使用深拷贝}
}
方法 2: 实现 Cloneable 接口并重写 clone() 方法

Java 提供了 Cloneable 接口和 Object.clone() 方法来支持对象的复制。默认情况下,clone() 方法执行的是浅拷贝。为了实现深拷贝,你需要重写 clone() 方法并在其中处理复杂类型的深拷贝。

public class Person implements Cloneable {private String name;private Address address;@Overrideprotected Object clone() throws CloneNotSupportedException {Person cloned = (Person) super.clone(); // 浅拷贝cloned.address = (Address) this.address.clone(); // 深拷贝 Address 对象return cloned;}
}public class Address implements Cloneable {private String city;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 因为 Address 只有基本类型,所以这里可以是浅拷贝}
}
方法 3: 序列化与反序列化

利用 Java 的序列化机制(Serializable 接口),你可以将对象序列化为字节流,然后再反序列化为新的对象。这种方法适用于大多数情况下的深拷贝,但需要注意性能问题以及类结构的变化可能导致的问题。

import java.io.*;public class Person implements Serializable {private String name;private Address address;public Person deepCopy() throws IOException, ClassNotFoundException {// 序列化ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream out = new ObjectOutputStream(bos);out.writeObject(this);// 反序列化ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream in = new ObjectInputStream(bis);return (Person) in.readObject();}
}
方法 4: 使用第三方库

有些第三方库如 Apache Commons Lang 提供了 SerializationUtils 类,可以简化深拷贝的操作。

import org.apache.commons.lang3.SerializationUtils;public class Person {private String name;private Address address;public Person deepCopy() {return SerializationUtils.clone(this);}
}

5. 常见优点

  • 独立性:深拷贝确保了新对象与原对象之间的完全独立,修改一个不会影响另一个。
  • 安全性:在多线程环境下或者当数据需要传递给不可信的代码时,深拷贝提供了更好的数据保护。
  • 一致性:深拷贝可以帮助你在不同时间点保存数据的状态,保证数据的一致性和可追溯性。
  • 灵活性:通过深拷贝,你可以在不改变原始数据的情况下自由地操作副本,增加了程序的灵活性。

6. 注意事项

  • 性能问题:深拷贝通常比浅拷贝更耗时,特别是在处理大型对象或嵌套较深的对象结构时。选择适当的深拷贝方法以平衡代码简洁性和性能。
  • 循环引用:如果对象图中有循环引用,必须特别小心处理,以避免无限递归。
  • 不可变对象:对于不可变对象(immutable objects),可以直接返回对象本身,因为它们不会被修改。
  • 线程安全:深拷贝并不保证线程安全,这取决于具体的实现方式和所使用的同步机制。
  • 内存消耗:深拷贝会创建全新的对象实例,可能会导致较大的内存消耗,尤其是在频繁复制大量数据时。

7. 进阶

1. 循环引用的处理

当对象图中存在循环引用时,简单的递归深拷贝可能会导致无限递归。解决方法包括:

  • 记忆化:使用一个映射表(如 HashMap)来记录已经复制过的对象,避免重复复制。
  • 弱引用:对于某些特定类型的循环引用,可以考虑使用弱引用(WeakReference)或其他策略来打破循环。
2. 性能优化

对于大规模数据或频繁的深拷贝操作,可以考虑以下优化措施:

  • 懒加载:仅在需要时才进行深拷贝,减少不必要的资源消耗。
  • 批量处理:对于多个对象的深拷贝,可以考虑批量处理以提高效率。
  • 自定义深拷贝逻辑:针对特定对象结构,编写高效的自定义深拷贝逻辑,避免通用方法带来的开销。
3. 深拷贝框架的选择

在实际项目中,选择合适的深拷贝框架非常重要。除了上述提到的 Apache Commons Lang,还有其他框架如:

  • Dozer:一个对象映射工具,支持深拷贝和对象转换。
  • MapStruct:用于生成类型安全的 Bean 映射代码,支持深拷贝。
  • ModelMapper:一个灵活的对象映射库,支持深拷贝和其他高级功能。

8. 总结

深拷贝是 Java 编程中非常重要的概念和技术,它确保了对象的完全独立复制,避免了共享引用带来的副作用。通过理解深拷贝的定义、应用场景、具体实现方法及其优缺点,你可以在实际开发中更好地应用这一技术,提升代码的质量和可靠性。同时,注意处理循环引用、优化性能等问题,以确保深拷贝的有效性和高效性。

相关文章:

Java 深拷贝全面解析

1. 引言 在 Java 编程中,对象之间的复制是一个常见的需求。根据复制的深度不同,我们可以将复制分为浅拷贝和深拷贝。本文将深入探讨 深拷贝(Deep Copy) 的概念、应用场景、具体实现方法及其优缺点,并提供一些实用的建…...

极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【一】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...

云原生架构中的中间件容器化:优劣势与实践探索

在云原生架构逐步推进的过程中,许多企业已经开始将应用和服务容器化,以充分利用云计算带来的弹性和自动化。随着容器技术的发展,容器化不仅仅限于应用层,越来越多的中间件也被考虑纳入容器化范畴,包括Redis、Kafka、Ra…...

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试? 速度:Go速度很快,这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性:可以利用Go的内置并发性(goroutines)来并行化测试执行 简单:Go的简约语法允许您编写可读且可维护…...

Adversarial Machine Learning(对抗机器学习)

之前把机器学习(Machine Learning)的安全问题简单记录了一下,这里有深入研究了一些具体的概念,这里记录一下方便以后查阅。 Adversarial Machine Learning(对抗机器学习) Adversarial Examples 相关内容Eva…...

EleutherAI/pythia-70m

EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型,它是 Pythia Scaling Suite 系列中参数量最小的模型,拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究; Pythia Scaling Suite是为促进可解释性…...

【C#】C#打印当前时间以及TimeSpan()介绍

1. C#打印当前时间 string currentDate DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");Console.WriteLine(currentDate);2. TimeSpan()介绍 TimeSpan(long ticks)的单位是100ns //500ms new TimeSpan(10*1000*500);参考: C#-TimeSpan-计算时间差...

典型常见的基于知识蒸馏的目标检测方法总结二

来源:https://github.com/LutingWang/awesome-knowledge-distillation-for-object-detection收录的方法 NeurIPS 2017:Learning Efficient Object Detection Models with Knowledge Distillation CVPR 2017:Mimicking Very Efficient Networ…...

设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)

前言: 设计一个完整的 监控摄像头物联网 IoT 平台 涉及 视频直播和点播、WebRTC 和 文件存储模块,可以分为以下几个主要部分:摄像头设备、服务端处理、Web 前端、视频流存储和回放。以下是结合这些技术的一个具体完整流程设计,涵盖…...

C# OpenCV机器视觉:凸包检测

在一个看似平常却又暗藏玄机的午后,阿强正悠闲地坐在实验室里,翘着二郎腿,哼着小曲儿,美滋滋地品尝着手中那杯热气腾腾的咖啡,仿佛整个世界都与他无关。突然,实验室的门 “砰” 的一声被撞开,小…...

yii2 手动添加 phpoffice\phpexcel

1.下载地址:https://github.com/PHPOffice/PHPExcel 2.解压并修改文件名为phpexcel 在yii项目的vendor目录下创建一个文件夹命名为phpoffice 把phpexcel目录放到phpoffic文件夹下 查看vendor\phpoffice\phpexcel目录下会看到这些文件 3.到vendor\composer目录下…...

Apifox 12月更新|接口的测试覆盖情况、测试场景支持修改记录、迭代分支能力升级、自定义项目角色权限、接口可评论

Apifox 新版本上线啦!!! 在快速迭代的开发流程中,接口测试工具的强大功能往往决定了项目的效率和质量。而 Apifox 在 12 月的更新中,再次引领潮流,推出了一系列重磅功能!测试覆盖情况分析、场景…...

“库存管理软件的用户体验”:界面与交互设计

3.1可行性分析 开发者在进行开发系统之前,都需要进行可行性分析,保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该库存管理软件所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识,同…...

Mysql大数据量表分页查询性能优化

一、模拟场景 1、产品表t_product,数据量500万+ 2、未做任何优化前,cout查询时间大约4秒;LIMIT offset, count 时,offset 值较大时查询时间越久。 count查询 SELECT COUNT(*) AS total FROM t_product WHERE deleted = 0 AND tenant_id = 1 分页查询 SELECT * FROM t_…...

Linux基础--1.1 什么是 Linux 操作系统

Linux 的起源与定义 Linux 是一种开源的操作系统,由 Linus Torvalds 于 1991 年首次发布。它基于 UNIX 操作系统,并以自由和开放为核心理念。Linux 的代码可以由任何人查看、修改并发布,这是它与许多专有操作系统(如 Windows 和 …...

数电实验期末作业——基于FPGA的数字时钟设计

1. 概述 本系统主要完成数字电子钟的以下功能: 1.计时功能(24小时) 2.闹钟功能(设置闹钟以及到时播放音乐) 3.校时功能 4.其他简单功能(清零、输入频率选择(1hz、500hz、5khz)、…...

hdfs命令(三)- hdfs 管理命令(三)- hdfs dfsadmin命令

文章目录 前言一、hdfs分布式文件系统管理命令1. 介绍2. 语法及解释3. 命令3.1 生成HDFS集群的状态报告3.1.1 语法及解释3.1.2 示例 3.2 重新加载配置文件并更新NameNode中的节点列表3.3 刷新指定DataNode上的NameNode信息3.3.1 语法 3.4 获取并显示指定DataNode的信息3.4.1 语…...

TCP off-path exploits(又一个弄巧成拙的例子)

承接前面几篇文章的观点,本文用一个安全攻击的例子说明为了解决一个伤害很低的低概率问题,会引入多么大的麻烦,这次是可怕的被攻击 (⊙o⊙)。 TCP 端口号只有 16bit,序列号只有 32bit,这意味着在强大攻击算力面前&…...

Docker【初识Docker】

目录 为什么会出现Docker这门技术喃? 应用开发和部署的困境 容器技术的先兆 Docker 的出现:简化容器化 Docker 技术的关键创新: Docker 的广泛应用和变革 什么是 Docker? Docker的历史 早期背景:容器化和虚拟化…...

开机存活脚本

vim datastadard_alive.sh #!/bin/bashPORT18086 # 替换为你想要检查的端口号 dt$(date %Y-%m-%d)# 使用netstat检查端口是否存在 if netstat -tuln | grep -q ":$PORT"; thenecho "$dt Port $PORT is in use" > /opt/datastadard/logs/alive.log# 如…...

【elementplus】中文模式

设置中文 <el-date-picker v-model“userAddKey” type“daterange” style“width: 240px” start-placeholder“Start Date” end-placeholder“End Date” change“handleUserAddChange” /> 引入&#xff1a; import zhCn from “element-plus/es/locale/lang/zh-cn”…...

【Docker命令】如何使用`docker exec`在容器内执行命令

大家好&#xff0c;今天我们来聊聊Docker容器管理中的一个非常有用的命令&#xff1a;docker exec。在日常工作中&#xff0c;我们经常需要在运行中的Docker容器内执行各种命令&#xff0c;docker exec正是帮助我们实现这一需求的利器。下面我将通过一个简单的例子&#xff0c;…...

FPGA的DMA应用——pcileech

硬件通过pcie总线&#xff0c;访存本机的内存&#xff0c;并进行修改&#xff0c;可以进行很多操作。 学习视频&#xff1a;乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址&#xff1a;AMD-Xilinx Vivado™ 2024.1 现…...

前后端数据交互

一、后端部分 1.创建Spring Boot项目&#xff1a;在IDEA中创建一个Spring Boot项目&#xff0c;引入必要的依赖。 2.编写Controller层&#xff1a;在Spring Boot项目中创建Controller&#xff0c;用于处理前端的请求和响应数据。 RestController RequestMapping("/demo/s…...

将现有Web 网页封装为macOS应用

文章目录 方式一&#xff1a;Unite for macOS方式二&#xff1a;Web2Desk方式三&#xff1a;Nativefier方式四&#xff1a;Flutter Flutter WebView Plugin总结 方式一&#xff1a;Unite for macOS Unite 是一款专为 macOS 设计的工具&#xff0c;可以将任意 Web 页面快速封装…...

代码随想录Day52 101. 孤岛的总面积,102. 沉没孤岛,103. 水流问题,104.建造最大岛屿。

1.孤岛的总面积 卡码网&#xff1a;101. 孤岛的总面积(opens new window) 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域&#xff0c;且完全被水域单元格…...

Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…...

逆袭之路(11)——python网络爬虫:原理、应用、风险与应对策略

困厄铸剑心&#xff0c;逆袭展锋芒。 寒苦凝壮志&#xff0c;腾跃绘华章。 我要逆袭。 目录 一、引言 二、网络爬虫的基本原理 &#xff08;一&#xff09;网络请求与响应 &#xff08;二&#xff09;网页解析 &#xff08;三&#xff09;爬行策略 三、网络爬虫的应用领…...

【Rust自学】7.3. 路径(Path)Pt.2:访问父级模块、pub关键字在结构体和枚举类型上的使用

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.3.1. super 我们可以通过在路径开头使用super来访问父级模块路径中的内容&#xff0c;就像使用..语法启动文件系统路径。例如&#xff…...

wangEditor富文本插件在vue项目中使用和媒体上传的实现

wangEditor是前端一个比较流行的简洁易用&#xff0c;功能强大的前端富文本编辑器&#xff0c;支持 JS Vue React&#xff0c;提供了很多丰富的功能&#xff0c;下面手把手教你实现wangWditor富文本插件在vue项目中配置&#xff0c;保存、图片上传等功能。无脑ctrlc即可 基本功…...

FFmpeg 的常用API

FFmpeg 的常用API 附录&#xff1a;FFmpeg库介绍 库介绍libavcodec音视频编解码核心库编码 (avcodec_send_frame, avcodec_receive_packet)。解码 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音视频流的解析和封装功能&#xff0c;多种多媒体封装格式&…...

【软件】教务系统成绩提交工具使用步骤

【软件】教务系统成绩提交工具使用步骤 零、快速开始 安装 与大多数软件一样&#xff0c;安装步骤很简单&#xff0c;一直点击“下一步”即可快速完成安装&#xff0c;安装完成后&#xff0c;在桌面会有一个软件图标&#xff0c;双击即可打开软件主界面。 导入成绩到Excel中…...

es快速扫描

介绍 Elasticsearch简称es&#xff0c;一款开源的分布式全文检索引擎 可组建一套上百台的服务器集群&#xff0c;处理PB级别数据 可满足近实时的存储和检索 倒排索引 跟正排索引相对&#xff0c;正排索引是根据id进行索引&#xff0c;所以查询效率非常高&#xff0c;但是模糊…...

埃斯顿机器人程序模版案例,欢迎指点

埃斯顿机器人程序模版案例&#xff0c;欢迎指点...

解锁成长密码:探寻刻意练习之道

刻意练习&#xff0c;真有那么神&#xff1f; 在生活中&#xff0c;你是否有过这样的困惑&#xff1a;每天苦练英语口语&#xff0c;可一到交流时还是支支吾吾&#xff1b;埋头苦学吉他&#xff0c;却总是卡在几个和弦转换上&#xff1b;工作多年&#xff0c;业务能力却似乎陷入…...

对外发PDF设置打开次数

在线 Host PDF 文件并对链接进行限制——保障文件安全的最佳解决方案 在数字化办公和远程协作日益普及的今天&#xff0c;如何安全高效地分享 PDF 文件成为许多用户关注的重点。MaiPDF 作为一款功能强大的在线工具&#xff0c;不仅支持在线 host PDF 文件&#xff0c;还提供多…...

【Linux命令】su、sudo、sudo su、sudo -i、sudo -l的用法和区别

su 命令 su (Switch User 切换用户)&#xff0c;允许用户切换到另一个用户的身份&#xff0c;默认情况下是切换到 root 用户。 默认行为&#xff1a;如果只运行 su&#xff0c;则系统会要求输入 root 用户的密码来切换到 root 用户&#xff0c;获取管理员权限。 切换到其他用…...

leetcode hot 100搜索回溯

39. 组合总和 已解答 中等 相关标签 相关企业 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candi…...

记录-->为2025添砖java的第二天

如何在java中创建自己的方法呢&#xff0c;我认为它和在C语言c里面写函数就没啥区别&#xff0c;(⊙﹏⊙)&#xff0c;可能有一点点就是说public static int add(int a,int b){}就是得和main方法里面的状态一致。 import java.util.Scanner; public class Math3 {public stati…...

uniapp小程序实现弹幕不重叠

uniapp小程序实现弹幕不重叠 1、在父组件中引入弹幕组件 <template><!-- 弹幕 --><barrage ref"barrage" class"barrage-content" reloadDanmu"reloadDanmu"></barrage> </template> <script>import barr…...

拼多多纠偏,能否实现买卖平权?

科技新知 原创作者丨江蓠 编辑丨蕨影 当曾将仅退款、运费险作为标配的电商平台们开始听到商家诉求&#xff0c;有意优化营商环境&#xff0c;作为“仅退款”服务发起者的拼多多也坐不住了。 在推出一揽子减免计划讨好中小商家之后&#xff0c;拼多多近期被传正在内测精选用户…...

【Leetcode】3159. 查询数组中元素的出现位置

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个整数数组 nums &#xff0c;一个整数数组 queries 和一个整数 x 。 对于每个查询 q u e r i e s [ i ] queries[i] queries[i] &#xff0c;你需要找到 n u m s nums nu…...

PHP语言laravel框架中基于Redis的异步队列使用实践与原理

在 Laravel 中&#xff0c;基于 Redis 的异步队列是通过 Laravel 的队列系统与 Redis 服务结合来实现的。这种队列机制允许你将任务推送到队列中&#xff0c;并由后台工作进程异步处理这些任务。这样&#xff0c;你就可以将耗时的操作&#xff08;如发送邮件、处理视频、数据同…...

Element-plus自动导入

安装 npm i element-plus 自动引入 1. 安装两个插件 npm install -D unplugin-vue-components unplugin-auto-import2. 配置插件 vue3项目修改vite.config.js&#xff0c;把两个插件添加入即可&#xff0c;注意:不是覆盖原有配置 Vite // vite.config.js import { define…...

贪心算法(常见贪心模型)

常见贪心模型 简单排序模型 最小化战斗力差距 题目分析&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e5 10;int n; int a[N];int main() {// 请在此输入您的代码cin >> n;for (int i 1;i < n;i) cin >> a[i];sort(a1,a1n);…...

碰一碰发视频后端源码技术开发详解,支持OEM

一、引言 碰一碰发视频作为一种新颖的交互方式&#xff0c;在前端为用户带来便捷体验的同时&#xff0c;后端技术起着至关重要的支撑作用。后端负责管理视频资源、处理 NFC 标签信息与视频的关联逻辑、用户数据的存储与分析以及与前端的高效通信&#xff0c;确保整个系统稳定、…...

Python vs PHP:哪种语言更适合网页抓取

本文将比较 Python 和 PHP&#xff0c;以帮助读者确定哪种语言更适合他们的需求。文章将探讨两种语言的优点和缺点&#xff0c;并根据读者的经验水平分析哪种语言可能更容易上手。接下来&#xff0c;文章将深入探讨哪种语言在抓取网页数据方面更胜一筹。 简而言之&#xff0c;…...

SpringBoot 新特性

优质博文&#xff1a;IT-BLOG-CN 2.1.0新特性最低支持jdk8,支持tomcat9 对响应式编程的支持&#xff0c;spring-boot-starter-webflux starter POM可以快速开始使用Spring WebFlux&#xff0c;它由嵌入式Netty服务器支持 1.5.8 2.1.0/2.7.0/3.0.0 Configuration propertie…...

NAT 技术如何解决 IP 地址短缺问题?

NAT 技术如何解决 IP 地址短缺问题&#xff1f; 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 随着互联网的普及和发展&#xff0c;IP 地址的需求量迅速增加。尤其是 IPv4 地址&…...

微积分复习(微分方程)

1,一阶微分方程 可分离的微分方程: 可以把x和y分列等号两边,然后求积分可以解决 齐次方程和准齐次方程 要求是 :yf(y/x),也就是没有单独的x项,我们可以通过设ty/x来统一变量方便我们运算 准齐次方程就是常数项不统一,我们可以将Xxa,Yyb来消灭常数项进而转化为齐次形式…...