探索 Java 中的 Bug 世界
在 Java 编程的旅程中,我们不可避免地会遇到各种 Bug。这些 Bug 可能会导致程序出现意外的行为、崩溃或者性能问题。了解 Java Bug 的类型、产生原因以及解决方法,对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。
一、Java Bug 的定义与分类
1. 定义
Bug,即程序中的错误或缺陷,它可能导致程序无法按照预期的方式运行。在 Java 中,Bug 可以表现为多种形式,从简单的语法错误到复杂的逻辑问题和性能瓶颈。
2. 分类
- 语法错误:这是最容易发现和修复的一类 Bug。当我们编写的 Java 代码不符合 Java 语言的语法规则时,编译器会抛出语法错误。例如,缺少分号、括号不匹配、变量未声明等。语法错误会阻止程序的编译,因此在开发过程中通常会被及时发现和修复。
int a = 10 // 缺少分号,编译器会报错
- 逻辑错误:逻辑错误是指程序在语法上正确,但在执行过程中产生了错误的结果。这类 Bug 通常比较难以发现,因为程序可以正常编译和运行,但输出的结果与预期不符。例如,算法错误、条件判断错误、循环控制错误等。
int sum = 0;
for (int i = 1; i < 10; i++) {sum += i;
}
System.out.println(sum); // 预期结果为 45,但如果循环条件错误,可能会得到错误的结果
- 运行时错误:运行时错误是在程序运行过程中发生的错误。这些错误可能是由于输入数据错误、资源不足、内存泄漏等原因引起的。例如,空指针异常、数组越界异常、算术异常等。
int[] arr = new int[5];
System.out.println(arr[10]); // 数组越界,会抛出 ArrayIndexOutOfBoundsException
- 性能问题:性能问题虽然不是严格意义上的 Bug,但也会影响程序的质量和用户体验。性能问题可能表现为程序运行缓慢、响应时间长、内存占用过高、CPU 使用率过高等。性能问题的原因可能是算法效率低下、数据库查询不合理、资源竞争等。
二、常见 Java Bug 的产生原因
1. 编码错误
- 粗心大意:编程是一项需要高度专注和细心的工作,但有时候我们会因为粗心大意而引入 Bug。例如,拼写错误、变量名混淆、忘记初始化变量等。
int a = 10;
int b = 20;
int c = a + d; // 变量 d 未声明,这是一个粗心导致的错误
- 对语言特性理解不深入:Java 语言有很多复杂的特性,如泛型、反射、多线程等。如果对这些特性理解不深入,很容易在使用过程中引入 Bug。例如,在使用泛型时,如果不注意类型擦除的问题,可能会导致类型安全问题;在使用多线程时,如果不注意线程同步和互斥,可能会导致数据不一致或死锁等问题。
List<String> list1 = new ArrayList<>();
List<Integer> list2 = list1; // 泛型不匹配,会在编译时或运行时产生错误
2. 环境因素
- 不同的 Java 版本:Java 语言在不断发展和演进,不同的版本之间可能会存在一些差异。如果我们的程序在一个版本的 Java 上运行良好,但在另一个版本上出现了问题,可能是由于版本差异导致的。例如,某些方法在旧版本中被弃用,或者在新版本中行为发生了变化。
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(date); // 在 Java 8 及以上版本中,SimpleDateFormat 不是线程安全的,可能会导致问题
- 第三方库和框架:在 Java 开发中,我们经常会使用第三方库和框架来提高开发效率。但是,这些第三方库和框架也可能存在 Bug,或者与我们的程序不兼容,从而导致问题。例如,某个库的新版本可能引入了不兼容的变化,或者某个库在特定的环境下会出现异常。
import com.example.library.LibClass;public class MyClass {public static void main(String[] args) {LibClass lib = new LibClass();lib.method(); // 如果库中存在 Bug,可能会导致程序出现异常}
}
3. 需求变更和设计缺陷
- 需求变更:在软件开发过程中,需求变更是很常见的。如果需求变更没有得到妥善处理,可能会导致程序出现 Bug。例如,在程序已经开发完成后,客户要求增加一个新的功能,而这个新功能可能会影响到现有的代码,从而引入 Bug。
class Product {private int id;private String name;private double price;public Product(int id, String name, double price) {this.id = id;this.name = name;this.price = price;}// getters and setters
}class ProductService {public void processProduct(Product product) {// 处理产品逻辑}
}public class Main {public static void main(String[] args) {Product product = new Product(1, "Apple", 5.99);ProductService service = new ProductService();service.processProduct(product);// 需求变更,需要增加产品的重量属性// 如果没有对现有代码进行适当的修改,可能会导致 Bug}
}
- 设计缺陷:设计缺陷是指在软件设计阶段就存在的问题。这些问题可能是由于对需求理解不透彻、设计方法不当、缺乏可扩展性等原因引起的。设计缺陷通常比较难以发现和修复,因为它们可能会影响到整个程序的结构和逻辑。
class Order {private List<Product> products;private double totalPrice;public Order() {products = new ArrayList<>();totalPrice = 0;}public void addProduct(Product product) {products.add(product);totalPrice += product.getPrice();}// getters and setters
}class OrderService {public void processOrder(Order order) {// 处理订单逻辑}
}public class Main {public static void main(String[] args) {Order order = new Order();Product product1 = new Product(1, "Apple", 5.99);Product product2 = new Product(2, "Banana", 3.99);order.addProduct(product1);order.addProduct(product2);OrderService service = new OrderService();service.processOrder(order);// 设计缺陷:如果订单中的产品数量非常大,计算总价格的方式可能会导致性能问题}
}
三、如何发现和修复 Java Bug
1. 调试工具
- IDE 调试器:大多数 Java 集成开发环境(IDE)都提供了强大的调试功能。我们可以使用 IDE 的调试器来设置断点、单步执行代码、查看变量的值等,从而帮助我们找到程序中的 Bug。例如,在 IntelliJ IDEA 中,我们可以在代码中设置断点,然后通过调试模式运行程序,当程序执行到断点处时,会暂停执行,我们可以查看当前的变量值、调用栈等信息,从而找出问题所在。
- 命令行调试器:除了 IDE 调试器,我们还可以使用命令行调试器来调试 Java 程序。例如,JDB(Java Debugger)是一个命令行调试工具,它可以帮助我们在没有 IDE 的情况下调试 Java 程序。使用 JDB 可以设置断点、查看变量的值、执行代码等,虽然不如 IDE 调试器方便,但在某些情况下可能会很有用。
2. 日志记录
- 日志框架:在 Java 中,有很多优秀的日志框架可供选择,如 Log4j、Logback、Slf4j 等。使用日志框架可以方便地记录程序的运行状态和错误信息,帮助我们在程序出现问题时快速定位问题。例如,我们可以在关键代码处添加日志记录,当程序出现异常时,可以查看日志文件,了解程序在出现问题之前的执行情况,从而找出问题所在。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass {private static final Logger logger = LoggerFactory.getLogger(MyClass.class);public static void main(String[] args) {try {// 可能会出现异常的代码int result = divide(10, 0);System.out.println(result);} catch (ArithmeticException e) {logger.error("出现算术异常:{}", e.getMessage());}}public static int divide(int a, int b) {return a / b;}
}
- 日志级别:日志框架通常提供了不同的日志级别,如 DEBUG、INFO、WARN、ERROR 等。我们可以根据需要设置不同的日志级别,以便在程序运行过程中记录不同级别的信息。例如,在开发阶段,我们可以设置日志级别为 DEBUG,以便记录更多的详细信息;在生产环境中,我们可以设置日志级别为 WARN 或 ERROR,只记录重要的错误信息,避免日志文件过大。
3. 代码审查
- 团队审查:代码审查是一种有效的发现 Bug 的方法。通过让其他开发人员审查我们的代码,可以发现我们自己可能忽略的问题。在团队审查中,开发人员可以互相交流、提出建议,从而提高代码的质量。例如,我们可以组织代码审查会议,让团队成员一起审查代码,或者使用代码审查工具,如 Gerrit、Review Board 等,进行在线代码审查。
- 自我审查:除了团队审查,我们也可以进行自我审查。在编写代码后,我们可以仔细检查自己的代码,查找可能存在的问题。自我审查可以帮助我们养成良好的编程习惯,提高代码的质量。例如,我们可以检查代码的语法、逻辑、命名规范等,确保代码的正确性和可读性。
4. 单元测试
- 单元测试框架:单元测试是一种软件开发方法,它通过编写测试用例来验证程序的各个单元(如方法、类)是否正确。在 Java 中,有很多优秀的单元测试框架可供选择,如 JUnit、TestNG 等。使用单元测试框架可以方便地编写和运行单元测试,从而帮助我们发现程序中的 Bug。例如,我们可以使用 JUnit 编写测试用例,对我们的代码进行测试,确保代码的正确性。
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;public class MyClassTest {@Testpublic void testAdd() {MyClass myClass = new MyClass();int result = myClass.add(10, 20);assertEquals(30, result);}
}class MyClass {public int add(int a, int b) {return a + b;}
}
- 测试覆盖率:测试覆盖率是指测试用例覆盖代码的程度。提高测试覆盖率可以帮助我们发现更多的 Bug。我们可以使用测试工具,如 JaCoCo、Cobertura 等,来测量测试覆盖率。例如,我们可以在项目中集成 JaCoCo,运行单元测试后,查看测试覆盖率报告,了解哪些代码没有被测试覆盖,从而有针对性地编写更多的测试用例。
四、预防 Java Bug 的方法
1. 良好的编程习惯
- 规范的命名:使用有意义的变量名、方法名和类名,可以提高代码的可读性和可维护性。避免使用模糊、不明确的命名,以免引起误解。例如,使用
customerName
而不是name
作为变量名,可以更清楚地表达变量的含义。 - 注释:添加适当的注释可以帮助我们更好地理解代码的功能和逻辑。注释应该简洁明了,避免过多的废话。例如,在方法上方添加注释,说明方法的功能、参数和返回值,可以提高代码的可读性。
/*** 计算两个整数的和* @param a 第一个整数* @param b 第二个整数* @return 两个整数的和*/
public int add(int a, int b) {return a + b;
}
- 代码格式化:保持代码的格式一致,可以提高代码的可读性和可维护性。使用代码格式化工具,如 Google Java Format、Eclipse 自带的代码格式化功能等,可以自动格式化代码,使代码风格更加统一。
2. 代码审查和测试
- 持续集成和持续部署(CI/CD):使用 CI/CD 工具可以自动化构建、测试和部署我们的代码。在每次代码提交后,CI/CD 工具会自动运行单元测试、集成测试等,确保代码的质量。如果测试失败,CI/CD 工具会及时通知开发人员,以便及时修复问题。例如,我们可以使用 Jenkins、Travis CI 等工具来实现 CI/CD。
- 代码静态分析工具:代码静态分析工具可以在不运行程序的情况下,分析代码的结构和质量,发现潜在的 Bug 和安全漏洞。例如,FindBugs、PMD、Checkstyle 等工具可以检查代码中的常见问题,如空指针引用、资源泄漏、代码风格等。我们可以在开发过程中集成这些工具,定期运行静态分析,及时发现和修复问题。
3. 学习和掌握 Java 最佳实践
- 遵循设计模式:设计模式是经过实践验证的解决特定问题的方案。学习和掌握设计模式可以帮助我们提高代码的质量和可维护性。例如,单例模式可以确保一个类只有一个实例;工厂模式可以方便地创建对象;观察者模式可以实现对象之间的松散耦合等。
- 了解 Java 性能优化技巧:Java 程序的性能问题也是一种常见的 Bug。了解 Java 性能优化技巧可以帮助我们提高程序的性能,避免性能瓶颈。例如,合理使用数据结构、避免不必要的对象创建、使用缓存等。
五、总结
Java Bug 是我们在编程过程中不可避免会遇到的问题。了解 Java Bug 的类型、产生原因以及解决方法,对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。通过使用调试工具、日志记录、代码审查、单元测试等方法,我们可以有效地发现和修复 Java Bug。同时,通过养成良好的编程习惯、进行代码审查和测试、学习和掌握 Java 最佳实践等方法,我们可以预防 Java Bug 的产生。在 Java 编程的旅程中,我们应该不断学习和积累经验,提高自己的编程水平,以更好地应对各种 Bug 的挑战。
希望这篇博客能够帮助你更好地理解和处理 Java Bug。如果你对博客的内容、结构、案例等有任何修改建议或其他想法,欢迎随时交流。
相关文章:
探索 Java 中的 Bug 世界
在 Java 编程的旅程中,我们不可避免地会遇到各种 Bug。这些 Bug 可能会导致程序出现意外的行为、崩溃或者性能问题。了解 Java Bug 的类型、产生原因以及解决方法,对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。 一、Java Bug 的定义与分类…...
【C++】等差数列末项计算题解析及优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述与输入输出要求💯数学分析与公式推导公差的计算通项公式推导 💯示例解析解题步骤 💯程序实现与解析初版代码代码解析优点与不足…...
【LeetCode】55.跳跃游戏
文章目录 题目链接:题目描述:解题思路(贪心算法): 题目链接: 55.跳跃游戏 题目描述: 解题思路(贪心算法): 如果某一个位置的元素为N,表示后面N…...
linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程
系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…...
SparkSQL编程实践
文章目录 SparkSQL编程实践1.1. 编程模型介绍1.2. SparkSQL编程1.2.1. 第三方库安装1.2.2. SparkSQL程序的结构1.2.3. SparkSQL执行模式1.2.3.1. Local模式1.2.3.2. 集群模式 1.2.4. 数据加载1.2.4.1. 通过RDD创建DataFrame1.2.4.2. 通过读取数据外部数据创建DataFrame标准读取…...
模型训练数据-MinerU一款Pdf转Markdown软件
模型训练数据-MinerU一款Pdf转Markdown软件-说明 简介: MinerU是什么 MinerU是上海人工智能实验室OpenDataLab团队推出的开源智能数据提取工具,专注于复杂PDF文档的高效解析与提取。MinerU能将包含图片、公式、表格等元素的多模态PDF文档转化为易于分析…...
shell基础用法
shell基础知识 shell中的多行注释 :<<EOF read echo $REPLY # read不指定变量,则默认写入$REPLY EOF # :<<EOF ...EOF 多行注释,EOF可以替换为!# 等文件目录和执行目录 echo $0$0 # ./demo.sh echo $0的realpath$(realpath…...
Redisson分布式锁
概览 个人博客源地址 Redisson不只是一个 Java Redis 客户端,它是一个以内存 Redis 服务器作为后端的处理 Java 对象(如 java.util.List, java.util.Map, java.util.Set, java.util.concurrent.locks.Lock 等)的一个框架。 Redisson提供了使用Redis的最简单和最…...
【C语言--趣味游戏系列】--电脑关机整蛊小游戏
前言: 老铁们,还是那句话,学习很苦游戏来补, 为了提高大家与朋友之间的友谊,博主在这里分享一个电脑关机的恶作剧小游戏,快拿去试试吧!!! 目录: 1.电脑关机代…...
C#实现一个HttpClient集成通义千问-开发前准备
集成一个在线大模型(如通义千问),来开发一个chat对话类型的ai应用,我需要先了解OpenAI的API文档,请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…...
二叉树优选算法(一)
一、根据二叉树创建字符串 题目介绍: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 "()" 表示,转化后需…...
单片机C51--笔记8-STC89C51RC/RD-IIC协议
一、概述 IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式。 特点 简单性和有效性。 由于接口直接在组件之上,因此IIC总线占用的空间非常小…...
HttpUtil的get和post请求
Http工具类 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.ht…...
leetcode 二进制数转字符串
1.题目要求: 2.题目代码: class Solution { public:string printBin(double num) {string result;double compare_value 1.0;//先给把0和.赋值给result;result.push_back(0);result.push_back(.);while(result.size() < 33){//利用十进制转换成二进制的方法//1.先给num …...
前端项目使用gitlab-cicd+docker实现自动化部署
GitLab CI/CD 是一个强大的工具,可以实现项目的自动化部署流程,从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker? 目前我们公司开发环境使用的shell脚本部署&#…...
【Linux】进程
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、冯诺依曼体系结构 🌟系统调用和库函数概念 二、操作系统OS 三、进程 🌟查看进程 🌟通过系统调用获取进程标示符 🌟通过系统调用创…...
transformers生成式对话机器人
简介 生成式对话机器人是一种先进的人工智能系统,它能够通过学习大量的自然语言数据来模拟人类进行开放、连贯且创造性的对话。与基于规则或检索式的聊天机器人不同,生成式对话机器人并不局限于预定义的回答集,而是可以根据对话上下文动态地…...
Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战
Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战 前言1.何为Text2SQL(NL2sql)2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展,人机交互的方式也在不断演进。…...
C# 关于加密技术以及应用(二)
AES(Advanced Encryption Standard)和 RSA(Rivest-Shamir-Adleman)是两种不同的加密算法,它们各自有特定的使用场景和优势。下面是它们的主要区别和适用场景: AES(高级加密标准) 特…...
四十四:Web如何关闭会话
在Web应用中,关闭会话(Session Termination)是一个重要的机制,用于确保用户的会话状态被安全地终止。无论是用户主动退出登录还是因超时被动登出,正确地管理会话关闭有助于提升安全性并释放服务器资源。 一、为什么需…...
在wsl2中安装archlinux
在之前的博客中,我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置,但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利,在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…...
在Goland中对goroutine协程断点调试
在Goland中对goroutine协程断点调试 环境: Goland 参考了 chatgpt 的回复 进行断点调试的代码 package mainimport ("fmt""sync""time" )// worker 模拟处理任务 func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 确保任务完成后…...
最长连续递增序列
问题分解 1:要求 要求找到最长的连续递增子序列,即在原数组中位置连续且数值严格递增的一段序列 2:输入和输出 输入是一个未经排序的整数数组nums 输出是该数组中最长连续递增子序列的长度 3:边界调节 数组为空则长度为0 …...
apt 包 源 的维护 和缓存 命令
APT 包源维护命令 更新软件包列表: sudo apt update:从配置的软件源中获取最新的软件包信息。这是安装、升级或删除软件包前通常要执行的步骤,以确保使用的是最新的软件包信息。 升级软件包: sudo apt upgrade:升级系…...
【排序方法的总结】
在数据结构中常见的排序方法有: 插入排序、交换排序、选择排序、归并排序和基数排序等。 插入排序 特点: 简单直观,对于小规模的数据排序效率较高。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后…...
工作中常用springboot启动后执行的方法
前言: 工作中难免会遇到一些,程序启动之后需要提前执行的需求。 例如: 初始化缓存:在启动时加载必要的缓存数据。定时任务创建或启动:程序启动后创建或启动定时任务。程序启动完成通知:程序启动完成后通…...
QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能
简介 在Qt中,使用QTableView和QStandardItemModel来实现将数据导出到Excel和从Excel导入到QTableView的功能,而不使用第三方库(如QXlsx)。 效果 将 QTableView 中的数据导出到Excel //从tableview 导出到 EXcle void MainInterfa…...
模版方法模式的理解和实践
在软件开发中,设计模式为我们提供了一套经过验证的解决方案,用于解决常见的设计问题。其中,模版方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改…...
05-树莓派-交叉编译
交叉编译的概念 交叉编译是什么 来源百度百科: 交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。 举例来说,我们常说的x86 Lin…...
杨振宁大学物理视频中黄色的字,c#写程序去掉
先看一下效果:(还有改进的余地) 我的方法是笨方法,也比较刻板。 1,首先想到,把屏幕打印下来。c#提供了这样一个函数: Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…...
非归档模式下一个或多个数据文件损坏恢复
1. 介绍 有些时侯可能你的库处于非归档的模式下,而你的联机重做日志又currupted,你的数据文件不能完成完全的恢复,这里为大家介绍一个oracle的一个隐藏参数_allow_resetlogs_corruption,让数据库重生。 通过设置隐含参数恢复 alter system …...
k8s 之storageclass使用nfs动态申请PV
文章目录 配置角色权限部署nfs-client-provisioner创建 NFS StorageClass创建 PVC 来动态申请 PV在 Pod 中使用 PVC验证存储是否正确挂载使用 kubectl 和 jq 筛选 PVCwaiting for a volume to be created, either by external provisioner "nfs-diy" or manually cre…...
Spark实训
实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…...
Mitel MiCollab 企业协作平台 任意文件读取漏洞复现(CVE-2024-41713)
0x01 产品简介 Mitel MiCollab是加拿大Mitel(敏迪)公司推出的一款企业级协作平台,旨在为企业提供统一、高效、安全的通信与协作解决方案。通过该平台,员工可以在任何时间、任何地点,使用任何设备,实现即时通信、语音通话、视频会议、文件共享等功能,从而提升工作效率和…...
React学习笔记(一)
创建函数写法一: 重点:函数有几种写法 function DemoShow() {return (<div className"App">函数声明</div>); }export default DemoShow;对应js创建函数声明:function sum1(a,b){return ab } 创建函数写法二&#x…...
【H2O2|全栈】MySQL的基本操作(三)
目录 前言 开篇语 准备工作 案例准备 多表查询 笛卡尔积 等值连接 外连接 内连接 自连接 子查询 存在和所有 含于 分页查询 建表语句 结束语 前言 开篇语 本篇继续讲解MySQL的一些基础的操作——数据字段的查询中的多表查询和分页查询,与单表查询…...
SQL按指定字符分割字符串
在SQL中分割字符串通常需要使用特定的函数,因为SQL本身并不像编程语言那样直接支持字符串分割。不同的数据库系统有不同的函数来处理字符串分割。以下是一些常见数据库系统中分割字符串的方法: 1. MySQL 在MySQL中,你可以使用SUBSTRING_IND…...
NAT traversal 原理 | TCP / UDP/ P2P
注:本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺,提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …...
喜报!极限科技(INFINI Labs)通过国家高新技术企业认定
2024 年 10 月 29 日,国家高新技术企业认定管理工作网公示了北京市认定机构 2024 年认定报备的第一批高新技术企业备案名单,极限数据(北京)科技有限公司 顺利通过本次高新技术企业评审,并获得 国家级“高新技术企业”认…...
在Ubuntu 22.04上搭建Kubernetes集群
Kubernetes 简介 什么是 Kubernetes? Kubernetes(常简称为 K8s)是一个强大的开源平台,用于管理容器化应用程序的部署、扩展和运行。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation(CNCF࿰…...
【OpenCV】平滑图像
二维卷积(图像滤波) 与一维信号一样,图像也可以通过各种低通滤波器(LPF)、高通滤波器(HPF)等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...
Vue了解
MVVM和MVC区别是什么? MVC : 传统的设计模式。 设计模式: 一套广泛被使用的开发方式 M: model 模型 模型:就是数据的意思 V : view视图 视图:就是页面的意思 C:controlle…...
JS 深拷贝浅拷贝
一、浅拷贝 // 假设有一个JSON对象 let originalObject {name: "Alice",age: 25,interests: ["reading", "coding"] };// 将JSON对象赋值给另一个变量 let copiedObject originalObject;// 修改新变量的属性 copiedObject.age 26;// 输出原始…...
设计模式学习之——单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这个模式的主要目的是控制对象的创建,确保在程序的整个生命周期中,某个类只有一个实例被创…...
Linux Vi/Vim使用 ⑥
掌握 CentOS 7 下的 Vi/Vim 编辑器:从安装到精通 在 CentOS 7 系统的日常运维、编程开发以及各类文本处理场景中,Vi/Vim 编辑器都是不可或缺的得力工具。它以轻量、高效、功能强大著称,虽然初次上手有一定学习门槛,但掌握之后便能…...
【5G】5G技术组件 5G Technology Components
5G的目标设置非常高,不仅在数据速率上要求达到20Gbps,在容量提升上要达到1000倍,还要为诸如大规模物联网(IoT, Internet of Things)和关键通信等新服务提供灵活的平台。这些高目标要求5G网络采用多种新技术…...
Java 学习,字符串比较
Java 字符串比较通常使用 equals() 方法,而不是使用 运算符。因为 运算符,比较的是字符串对象的引用是否相同,而 equals() 方法比较的是字符串的内容是否相同。 使用equals()等方法,比较两个字符串: public class …...
普通算法——二维前缀和
二维前缀和 题目链接:https://www.acwing.com/problem/content/798/ 题目描述: 输入一个 n n n 行 m m m 列的整数矩阵,再输入 q q q 个询问,每个询问包含四个整数 ** x 1 , y 1 , x 2 , y 2 x1,y1,x2,y2 x1,y1,x2,y2 &…...
2024年API接口发展趋势:智能化、自动化引领潮流
随着信息技术的飞速发展,应用程序编程接口(API)已成为现代软件开发的核心组成部分。API作为不同系统之间的桥梁,使得数据、功能和服务能够在各种平台和设备之间无缝流动。在2024年,API接口正经历着一系列显著的变革和发…...
SQL中的通配符:使用LIKE操作符进行模式匹配
在SQL中,LIKE 操作符用于在查询中进行模式匹配。它常用于 WHERE 子句中,以便根据特定模式查找数据。与直接进行精确匹配的 操作符不同,LIKE 允许你使用通配符来对数据进行模糊查询,从而使查询更加灵活和强大。 常见的SQL通配符 …...