Java开发提速秘籍:巧用Apache Commons Lang工具库
一、Java 开发效率之困
在当今数字化时代,Java 作为一门广泛应用的编程语言,在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台,还是移动应用后端,都能看到 Java 的身影。然而,Java 开发者们在享受其强大功能与稳定性的同时,也常常面临开发效率方面的挑战。
在实际开发过程中,我们经常会遇到一些看似基础却又繁琐的任务。以字符串处理为例,判断一个字符串是否为空或仅包含空格,在 Java 标准库中,我们需要编写如下代码:
String str = " ";if (str == null || str.trim().length() == 0) {// 处理空字符串情况}
这段代码虽然不难理解,但每次都要编写这样的判断逻辑,无疑增加了开发的工作量。再如日期操作,计算两个日期之间的天数差,使用 Java 标准库需要涉及到复杂的Calendar类操作,代码如下:
import java.util.Calendar;Calendar calendar1 = Calendar.getInstance();calendar1.set(2023, 10, 1);Calendar calendar2 = Calendar.getInstance();calendar2.set(2023, 10, 10);long timeDiff = Math.abs(calendar2.getTimeInMillis() - calendar1.getTimeInMillis());int daysDiff = (int) (timeDiff / (1000 * 60 * 60 * 24));
这段代码不仅冗长,而且容易出错。这些问题的存在,不仅降低了开发效率,还增加了代码出错的风险。为了解决这些问题,开发者们往往需要寻找更高效的解决方案。而 Apache Commons Lang 工具库,正是这样一个能帮助我们提升 Java 开发效率的利器。
二、Apache Commons Lang 初相识
Apache Commons Lang 是 Apache Commons 项目家族中的重要成员,这个项目专注于为 Java 开发者提供一系列实用的工具类,旨在增强 Java 核心类库的功能。它就像是一个精心打造的工具百宝箱,里面装满了各种能让开发工作变得更加轻松高效的工具。
该工具库的诞生,源于 Java 开发者在日常编码中反复遇到的一些繁琐问题。例如,在处理字符串、日期、数组等常见数据类型时,Java 标准库提供的功能有时显得不够便捷,开发者往往需要编写大量重复的样板代码。Apache Commons Lang 的出现,很好地解决了这些问题。它通过提供一系列功能强大且易用的工具类,让开发者能够用更简洁的代码完成复杂的任务,从而大大减少了样板代码的编写量,提升了开发效率。
在业界,Apache Commons Lang 得到了极为广泛的应用。众多知名的开源项目和企业级应用都依赖于它来简化开发过程。许多大型互联网公司在其核心业务系统中大量使用 Apache Commons Lang,以提高系统的开发效率和稳定性。它已经成为 Java 开发领域中不可或缺的一部分,为无数开发者节省了大量的时间和精力。
三、引入 Lang 库,开启高效之旅
在使用 Apache Commons Lang 库之前,我们需要先将其引入到项目中。在 Java 项目中,引入依赖通常通过构建工具来完成,常见的构建工具如 Maven 和 Gradle,下面将分别介绍如何使用这两种工具引入 Apache Commons Lang 库。
Maven 引入方式
如果你的项目使用 Maven 进行构建,那么在项目的pom.xml文件中添加如下依赖:
<dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency></dependencies>
在上述代码中,<groupId>指定了库的组织 ID,org.apache.commons表示这是 Apache Commons 项目下的库。<artifactId>指定了库的名称,这里是commons-lang3,表示我们引入的是 Apache Commons Lang 库的第 3 版。<version>指定了库的版本号,3.12.0是当前的一个较新版本,你可以根据实际需求替换为其他版本。
添加完依赖后,保存pom.xml文件,Maven 会自动下载指定版本的 Apache Commons Lang 库及其依赖项。如果在项目中使用了 Maven 的mvn clean install或mvn clean compile等命令,Maven 会在构建过程中自动处理依赖关系,确保库被正确引入到项目中。
Gradle 引入方式
若项目使用 Gradle 进行构建,在项目的build.gradle文件中添加如下依赖:
dependencies {implementation 'org.apache.commons:commons-lang3:3.12.0'}
在这段代码中,implementation表示依赖的范围,它确保该依赖在编译和运行时都可用。org.apache.commons:commons-lang3:3.12.0指定了依赖的坐标,与 Maven 中的<groupId>、<artifactId>和<version>相对应。
同样,保存build.gradle文件后,Gradle 会在项目构建时自动下载并引入指定版本的 Apache Commons Lang 库。如果在 Gradle 中使用了gradle build等构建命令,Gradle 会根据配置的依赖关系进行处理。
通过以上两种方式,我们就可以将 Apache Commons Lang 库引入到 Java 项目中,为后续使用其强大的功能奠定基础。
四、核心功能大揭秘
(一)字符串处理,得心应手
在 Java 开发中,字符串处理是极为常见的操作,而StringUtils类则是 Apache Commons Lang 库中处理字符串的得力助手。它提供了一系列丰富且实用的方法,大大简化了字符串处理的过程。
判断字符串是否为空是一个常见需求。使用StringUtils类的isEmpty方法,我们可以轻松实现这一判断。例如:
import org.apache.commons.lang3.StringUtils;public class StringUtilsDemo {public static void main(String[] args) {String str1 = null;String str2 = "";String str3 = " ";String str4 = "Hello";System.out.println(StringUtils.isEmpty(str1)); // 输出: trueSystem.out.println(StringUtils.isEmpty(str2)); // 输出: trueSystem.out.println(StringUtils.isEmpty(str3)); // 输出: falseSystem.out.println(StringUtils.isEmpty(str4)); // 输出: false}}
在上述代码中,StringUtils.isEmpty方法能够准确判断字符串是否为空,包括null值和空字符串,并且对仅包含空格的字符串也能正确处理。
去除字符串两端的空白字符也是经常会用到的操作。利用StringUtils类的trim方法,能轻松实现这一功能,示例代码如下:
import org.apache.commons.lang3.StringUtils;public class StringUtilsTrimDemo {public static void main(String[] args) {String str = " Hello World ";String trimmedStr = StringUtils.trim(str);System.out.println(trimmedStr); // 输出: Hello World}}
这里,StringUtils.trim方法将字符串str两端的空白字符去除,得到了干净的字符串Hello World。
若要反转字符串,StringUtils类的reverse方法能派上用场。如下代码展示了如何使用该方法:
import org.apache.commons.lang3.StringUtils;public class StringUtilsReverseDemo {public static void main(String[] args) {String str = "Hello";String reversedStr = StringUtils.reverse(str);System.out.println(reversedStr); // 输出:olleH}}
通过StringUtils.reverse方法,字符串Hello被成功反转成olleH。
判断一个字符串是否全部由数字组成,在数据校验等场景中非常重要。StringUtils类的isNumeric方法可以帮助我们实现这一判断,示例如下:
import org.apache.commons.lang3.StringUtils;public class StringUtilsIsNumericDemo {public static void main(String[] args) {String str1 = "12345";String str2 = "123a45";System.out.println(StringUtils.isNumeric(str1)); // 输出: trueSystem.out.println(StringUtils.isNumeric(str2)); // 输出: false}}
在这段代码中,StringUtils.isNumeric方法准确判断出str1全部由数字组成,而str2包含非数字字符。
(二)数字操作,精准高效
在涉及数字处理的场景中,NumberUtils类提供了诸多实用功能,让数字操作变得更加简单高效。
判断一个字符串是否可以转换为数字,是常见的需求。使用NumberUtils类的isCreatable方法,可以轻松实现这一判断。例如:
import org.apache.commons.lang3.math.NumberUtils;public class NumberUtilsIsCreatableDemo {public static void main(String[] args) {String str1 = "123";String str2 = "abc";System.out.println(NumberUtils.isCreatable(str1)); // 输出: trueSystem.out.println(NumberUtils.isCreatable(str2)); // 输出: false}}
上述代码中,NumberUtils.isCreatable方法能够准确判断出字符串str1可以转换为数字,而str2无法转换。
将字符串转换为数字类型,在数据处理中经常会用到。NumberUtils类提供了多种方法来满足这一需求,如toInt、toLong、toDouble等。以下代码展示了如何将字符串转换为整数:
import org.apache.commons.lang3.math.NumberUtils;public class NumberUtilsToIntDemo {public static void main(String[] args) {String str = "123";int num = NumberUtils.toInt(str);System.out.println(num); // 输出: 123}}
这里,NumberUtils.toInt方法将字符串str成功转换为整数类型。
在处理多个数字时,求这些数字中的最大值和最小值是常见的操作。NumberUtils类的max和min方法可以方便地实现这一功能。例如:
import org.apache.commons.lang3.math.NumberUtils;public class NumberUtilsMaxMinDemo {public static void main(String[] args) {int num1 = 10;int num2 = 20;int num3 = 15;int maxNum = NumberUtils.max(num1, num2, num3);int minNum = NumberUtils.min(num1, num2, num3);System.out.println("最大值: " + maxNum); // 输出: 最大值: 20System.out.println("最小值: " + minNum); // 输出: 最小值: 10}}
在这段代码中,NumberUtils.max方法找出了num1、num2、num3中的最大值,NumberUtils.min方法找出了最小值。
(三)对象处理,轻松应对
ObjectUtils类为对象处理提供了一系列便捷的方法,在日常开发中非常实用。
判断一个对象是否为空,是避免空指针异常的重要步骤。使用ObjectUtils类的isEmpty方法,可以简洁地判断对象是否为空。例如:
import org.apache.commons.lang3.ObjectUtils;public class ObjectUtilsIsEmptyDemo {public static void main(String[] args) {Object obj1 = null;Object obj2 = new Object();System.out.println(ObjectUtils.isEmpty(obj1)); // 输出: trueSystem.out.println(ObjectUtils.isEmpty(obj2)); // 输出: false}}
在上述代码中,ObjectUtils.isEmpty方法准确判断出obj1为空对象,而obj2不为空。
在某些情况下,我们需要获取一个非空的对象,如果原对象为空,则返回一个默认值。ObjectUtils类的defaultIfNull方法可以满足这一需求。例如:
import org.apache.commons.lang3.ObjectUtils;public class ObjectUtilsDefaultIfNullDemo {public static void main(String[] args) {Object obj1 = null;Object defaultValue = new Object();Object result = ObjectUtils.defaultIfNull(obj1, defaultValue);System.out.println(result!= null); // 输出: true}}
这里,ObjectUtils.defaultIfNull方法在obj1为空时,返回了默认值defaultValue。
比较两个对象是否相等,也是常见的操作。ObjectUtils类的equals方法可以帮助我们实现这一比较,并且它对null值进行了安全处理。例如:
import org.apache.commons.lang3.ObjectUtils;public class ObjectUtilsEqualsDemo {public static void main(String[] args) {Object obj1 = "Hello";Object obj2 = "Hello";Object obj3 = null;System.out.println(ObjectUtils.equals(obj1, obj2)); // 输出: trueSystem.out.println(ObjectUtils.equals(obj1, obj3)); // 输出: false}}
在这段代码中,ObjectUtils.equals方法正确判断出obj1和obj2相等,而obj1和obj3不相等。
(四)数组操作,灵活多样
在处理数组时,ArrayUtils类提供了丰富的方法,使数组操作变得更加灵活和高效。
判断一个数组是否为空,是常见的操作。使用ArrayUtils类的isEmpty方法,可以方便地判断数组是否为空。例如:
import org.apache.commons.lang3.ArrayUtils;public class ArrayUtilsIsEmptyDemo {public static void main(String[] args) {String[] arr1 = null;String[] arr2 = {};String[] arr3 = {"Hello", "World"};System.out.println(ArrayUtils.isEmpty(arr1)); // 输出: trueSystem.out.println(ArrayUtils.isEmpty(arr2)); // 输出: trueSystem.out.println(ArrayUtils.isEmpty(arr3)); // 输出: false}}
上述代码中,ArrayUtils.isEmpty方法能够准确判断出arr1和arr2为空数组,而arr3不为空。
反转数组的顺序,在某些算法和数据处理场景中非常有用。ArrayUtils类的reverse方法可以轻松实现数组的反转。例如:
import org.apache.commons.lang3.ArrayUtils;public class ArrayUtilsReverseDemo {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5};int[] reversedArr = ArrayUtils.reverse(arr);for (int num : reversedArr) {System.out.print(num + " "); // 输出: 5 4 3 2 1}}}
这里,ArrayUtils.reverse方法将数组arr的顺序成功反转。
向数组中添加元素,是数组操作的常见需求。ArrayUtils类的add方法可以在数组的指定位置添加一个元素。例如:
import org.apache.commons.lang3.ArrayUtils;public class ArrayUtilsAddDemo {public static void main(String[] args) {String[] arr = {"Hello", "World"};String[] newArr = ArrayUtils.add(arr, 1, "Java");for (String str : newArr) {System.out.print(str + " "); // 输出: Hello Java World}}}
在这段代码中,ArrayUtils.add方法在数组arr的索引 1 处添加了元素Java,生成了新的数组newArr。
(五)日期处理,简单便捷
在处理日期相关的业务逻辑时,DateUtils类提供了一系列实用的方法,大大简化了日期操作的复杂度。
对日期进行加减操作,是常见的需求。例如,计算某个日期加上或减去一定天数后的日期。使用DateUtils类的addDays和subtractDays方法,可以轻松实现这一功能。以下代码展示了如何计算当前日期加上 5 天后的日期:
import org.apache.commons.lang3.time.DateUtils;import java.util.Date;public class DateUtilsAddDaysDemo {public static void main(String[] args) throws Exception {Date currentDate = new Date();Date newDate = DateUtils.addDays(currentDate, 5);System.out.println(newDate);}}
在上述代码中,DateUtils.addDays方法将当前日期currentDate加上 5 天,得到了新的日期newDate。
比较两个日期的先后顺序,在日期相关的业务逻辑中非常重要。DateUtils类的compare方法可以方便地比较两个日期的大小。例如:
import org.apache.commons.lang3.time.DateUtils;import java.util.Date;public class DateUtilsCompareDemo {public static void main(String[] args) throws Exception {Date date1 = new Date();Date date2 = DateUtils.addDays(date1, 3);int result = DateUtils.compare(date1, date2);if (result < 0) {System.out.println("date1早于date2");} else if (result > 0) {System.out.println("date1晚于date2");} else {System.out.println("date1等于date2");}}}
这里,DateUtils.compare方法比较了date1和date2的大小,并根据比较结果输出相应的信息。
将日期格式化为指定的字符串形式,也是常见的操作。DateUtils类结合SimpleDateFormat类,可以实现日期的格式化。例如,将日期格式化为yyyy - MM - dd的形式,示例代码如下:
import org.apache.commons.lang3.time.DateUtils;import java.text.SimpleDateFormat;import java.util.Date;public class DateUtilsFormatDemo {public static void main(String[] args) throws Exception {Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy - MM - dd");String formattedDate = sdf.format(date);System.out.println(formattedDate);}}
在这段代码中,通过SimpleDateFormat类将日期date格式化为yyyy - MM - dd形式的字符串formattedDate。
五、实际案例看效果
为了更直观地感受 Apache Commons Lang 工具库对 Java 开发效率的提升,我们来看一个电商系统开发的实际案例。
在电商系统中,用户注册登录功能是基础且重要的部分。在验证用户输入的用户名和密码时,需要进行字符串的非空校验。使用 Apache Commons Lang 的StringUtils类,代码如下:
import org.apache.commons.lang3.StringUtils;public class UserRegistration {public static boolean validateUsername(String username) {return!StringUtils.isEmpty(username);}public static boolean validatePassword(String password) {return!StringUtils.isEmpty(password) && password.length() >= 6;}}
上述代码中,validateUsername方法使用StringUtils.isEmpty方法快速判断用户名是否为空,validatePassword方法不仅判断密码是否为空,还检查了密码长度是否至少为 6 位。这种方式相比使用 Java 标准库,代码更加简洁明了。
订单数据处理是电商系统的核心环节之一。在计算订单总金额时,可能涉及到多个价格的数字计算。利用NumberUtils类,示例代码如下:
import org.apache.commons.lang3.math.NumberUtils;public class OrderCalculation {public static double calculateTotalPrice(String[] prices) {double total = 0;for (String price : prices) {if (NumberUtils.isCreatable(price)) {total += NumberUtils.toDouble(price);}}return total;}}
在这段代码中,calculateTotalPrice方法首先使用NumberUtils.isCreatable方法判断字符串是否可以转换为数字,然后使用NumberUtils.toDouble方法将字符串转换为双精度浮点数进行累加,实现了订单总金额的计算。
在商品信息管理模块,需要对商品对象进行各种操作。例如,判断商品对象是否为空,使用ObjectUtils类的代码如下:
import org.apache.commons.lang3.ObjectUtils;public class ProductManagement {public static boolean isProductValid(Product product) {return!ObjectUtils.isEmpty(product);}}class Product {// 商品类的属性和方法}
这里,isProductValid方法通过ObjectUtils.isEmpty方法判断商品对象是否为空,确保商品信息的有效性。
在展示订单列表时,需要对订单数组进行处理。比如,对订单按照时间进行排序后,可能需要反转订单数组的顺序,以最新的订单排在前面。使用ArrayUtils类的代码如下:
import org.apache.commons.lang3.ArrayUtils;import java.util.Arrays;import java.util.Comparator;public class OrderListDisplay {public static Order[] reverseOrderArray(Order[] orders) {Arrays.sort(orders, Comparator.comparing(Order::getOrderTime).reversed());return ArrayUtils.reverse(orders);}}class Order {private String orderTime;public String getOrderTime() {return orderTime;}public void setOrderTime(String orderTime) {this.orderTime = orderTime;}}
在reverseOrderArray方法中,首先对订单数组进行排序,然后使用ArrayUtils.reverse方法反转数组顺序,方便展示最新的订单。
在处理订单的时间相关业务时,如计算订单的预计送达时间,使用DateUtils类的示例如下:
import org.apache.commons.lang3.time.DateUtils;import java.util.Date;public class OrderTimeCalculation {public static Date calculateDeliveryTime(Date orderDate, int days) {return DateUtils.addDays(orderDate, days);}}
calculateDeliveryTime方法通过DateUtils.addDays方法,在订单日期的基础上加上指定的天数,计算出预计送达时间。
通过这个电商系统的案例可以看出,在各个关键业务环节中,Apache Commons Lang 工具库都能发挥重要作用,显著减少代码量,提高开发效率,使代码更加简洁、易读和维护。
六、注意事项要牢记
在享受 Apache Commons Lang 带来的便捷时,我们也需要留意一些使用过程中的注意事项,以确保代码的稳定性和高效性。
不同版本的 Apache Commons Lang 库在功能和兼容性上可能存在差异。在选择版本时,要充分考虑项目所使用的 JDK 版本以及其他相关依赖的兼容性。例如,某些较新的功能可能仅在特定的高版本库中可用,若项目使用的 JDK 版本较低,可能无法引入最新版的 Lang 库,此时就需要选择一个兼容的版本 。同时,关注库的更新日志也是非常重要的,它能帮助我们了解版本之间的变化,及时调整代码以适应这些变化。
在使用工具库中的方法时,务必仔细查看方法的参数类型和返回值类型。因为这些方法的设计初衷是为了满足各种通用场景,其参数和返回值的定义可能较为灵活。例如,StringUtils类中的某些方法可能接受CharSequence类型的参数,而不仅仅是String类型。如果在调用方法时传入了不匹配的参数类型,可能会导致编译错误或运行时异常。另外,对于方法的返回值,也要清楚其含义和可能的取值范围,以便正确处理返回结果。
虽然 Apache Commons Lang 库中的许多方法对null值进行了安全处理,但在实际使用中,仍需注意避免空指针异常。尤其是在涉及对象嵌套调用的场景下,即使外层方法对null值进行了处理,内层方法仍可能因未正确处理null值而抛出异常。例如,在使用ObjectUtils类的方法处理复杂对象时,如果对象的某个属性为null,而后续操作又依赖于该属性,就需要提前进行null值检查。
尽管 Apache Commons Lang 库能够显著提升开发效率,但也不应过度依赖。在某些特定的场景下,原生的 Java 代码可能具有更好的性能。例如,在一些对性能要求极高且逻辑简单的操作中,使用 Java 标准库中的方法可能比引入外部库的方法更加高效。因此,在使用时需要根据具体的业务场景和性能需求,合理选择是否使用 Lang 库的方法,以达到最佳的性能平衡。
七、总结与展望
Apache Commons Lang 工具库无疑是 Java 开发者手中的一把利器,为我们在开发过程中提供了诸多便利。通过引入这个工具库,我们能够以更简洁、高效的方式处理字符串、数字、对象、数组和日期等常见的数据类型和操作。在实际项目中,它显著减少了样板代码的编写量,提高了代码的可读性和可维护性,进而大大提升了开发效率。
从字符串处理的各种便捷方法,到数字操作的精准高效实现;从对象处理的安全可靠方式,到数组操作的灵活多样手段,再到日期处理的简单便捷功能,Apache Commons Lang 工具库在各个方面都展现出了强大的优势。它不仅让我们的开发工作变得更加轻松,还降低了出错的风险。
对于广大 Java 开发者来说,深入学习和熟练使用 Apache Commons Lang 工具库是提升自身开发能力和效率的重要途径。我们应该充分利用这个工具库提供的丰富功能,不断优化我们的代码。同时,随着技术的不断发展,我们也期待 Apache Commons Lang 工具库能够持续更新和完善,为 Java 开发领域带来更多的惊喜和助力,帮助我们在开发的道路上不断前行,创造出更加优秀的软件产品 。
相关文章:
Java开发提速秘籍:巧用Apache Commons Lang工具库
一、Java 开发效率之困 在当今数字化时代,Java 作为一门广泛应用的编程语言,在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台,还是移动应用后端,都能看到 Java 的身影。然而,Java 开发者…...

使用sql查询excel内容
1. 简介 我们在前面的文章中提到了calcite支持csv和json文件的数据源适配, 其实就是将文件解析成表然后以文件夹为schema, 然后将生成的schema注册到RootSehema(RootSchema是所有数据源schema的parent,多个不同数据源schema可以挂在同一个RootSchema下)下, 最终使用…...

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令
[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字,还实现了服务器端和客户端的通信,本…...

电子应用设计方案101:智能家庭AI喝水杯系统设计
智能家庭 AI 喝水杯系统设计 一、引言 智能家庭 AI 喝水杯系统旨在为用户提供个性化的饮水提醒和健康管理服务,帮助用户养成良好的饮水习惯。 二、系统概述 1. 系统目标 - 精确监测饮水量和饮水频率。 - 根据用户的身体状况和活动量,智能制定饮水计划。…...
vue学习路线
以下是一个详细的Vue学习路线: 一、基础入门 (一)环境搭建 1. 安装Node.js和npm:Vue项目依赖于Node.js环境,需从官网下载并安装最新版本的Node.js,npm会随Node.js一起安装。 2. 安装Vue CLI:V…...
(15)Chainlink Automation(定时任务) 详细介绍及用法
Chainlink Automation 详细介绍 1. 什么是 Chainlink Automation? Chainlink Automation 是 Chainlink 提供的一个去中心化服务,专门用于自动化执行智能合约的链上操作。它允许开发者基于时间或特定条件(如链上或链下事件)触发智…...

从入门到精通:RabbitMQ的深度探索与实战应用
目录 一、RabbitMQ 初相识 二、基础概念速览 (一)消息队列是什么 (二)RabbitMQ 核心组件 三、RabbitMQ 基本使用 (一)安装与环境搭建 (二)简单示例 (三)…...

基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...

【vitePress】基于github快速添加评论功能(giscus)
一.添加评论插件 使用giscus来做vitepress 的评论模块,使用也非常的简单,具体可以参考:giscus 文档,首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档,如下图所示,填入你的 github 用户…...

PID 控制算法(二):C 语言实现与应用
在本文中,我们将用 C 语言实现一个简单的 PID 控制器,并通过一个示例来演示如何使用 PID 控制算法来调整系统的状态(如温度、速度等)。同时,我们也会解释每个控制参数如何影响系统的表现。 什么是 PID 控制器…...
Git本地搭建
Git本地搭建 (项目突然不给创建仓库了,为了方便管理项目只能自己本地搭建git服务) 为了在本地搭建Git环境并实现基本的Git操作,步骤如下: 安装Git软件 Windows:从Git官方网站下载并安装适用于Windows…...

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
前言 ORB-SLAM2源码学习:Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点,但是经过三角化成功的三维点并不一定是有效的,需要筛选才能作为初始化地图点。 …...
leetcode 2239. 找到最接近 0 的数字
题目:2239. 找到最接近 0 的数字 - 力扣(LeetCode) 加班用手机刷水题,补个记录 1 class Solution { public:int findClosestNumber(vector<int>& nums) {int ret nums[0];for (int i 1; i < nums.size(); i) {if…...
Rust实现内网穿透工具:从原理到实现
目录 1.前言2.内网穿透原理3.丐版实现3.1 share3.2 server3.3 client3.4 测试4.项目优化4.1 工作空间4.2 代码合并4.3 无锁优化4.4 数据分离4.5 错误处理4.6 测试代码4.7 参数解析本篇原文为:Rust实现内网穿透工具:从原理到实现 更多C++进阶、rust、python、逆向等等教程,可…...
【深度学习】1.深度学习解决问题与应用领域
深度学习要解决的问题 一、图像识别相关问题 物体识别 背景和意义:在众多的图像中识别出特定的物体,例如在安防监控领域,识别出画面中的人物、车辆等物体类别。在自动驾驶技术中,车辆需要识别出道路上的行人、交通标志、其他车辆…...

文档解析:PDF里的复杂表格、少线表格如何还原?
PDF中的复杂表格或少线表格还原通常需要借助专业的工具或在线服务,以下是一些可行的方法: 方法一:使用在线PDF转换工具 方法二:使用桌面PDF编辑软件 方法三:通过OCR技术提取表格 方法四:手动重建表格 …...

深圳大学-计算机系统(3)-实验三取指和指令译码设计
实验目标 设计完成一个连续取指令并进行指令译码的电路,从而掌握设计简单数据通路的基本方法。 实验内容 本实验分成三周(三次)完成:1)首先完成一个译码器(30分);2)接…...

Java Swing 编程全面解析:从 AWT 到 Swing 的进化之路
目录 前言 一、AWT 简介 1. 什么是 AWT? 2. AWT 的基本组件 3. AWT 编程示例 二、Swing 的诞生与进化 1. Swing 的特点 2. Swing 和 AWT 的主要区别 3. Swing 的基本组件 三、Swing 编程的基础示例 四、Swing 的高级功能 1. 布局管理器 2. 事件监听 3…...
mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录
本人出现该问题的环境是xampp,异常关机,再次在xampp控制面板启动mysql出现该问题。出现问题折腾数据库之前,先备份数据,将mysql目录下的data拷贝到其他地方,这很重要。 然后开始折腾。 查资料,会发现很多…...
2025年大模型对智能硬件发展的助力与创新创意
随着人工智能(AI)技术,尤其是大模型的快速进步,智能硬件领域正在经历前所未有的变革。到2025年,大模型不仅能为智能硬件提供强大的算法支持,还能通过数据处理、智能决策和系统集成等方面的创新,推动硬件设备的性能提升和功能拓展。本文将从多个维度分析大模型对智能硬件…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...