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年,大模型不仅能为智能硬件提供强大的算法支持,还能通过数据处理、智能决策和系统集成等方面的创新,推动硬件设备的性能提升和功能拓展。本文将从多个维度分析大模型对智能硬件…...

Tensor 基本操作1 unsqueeze, squeeze, softmax | PyTorch 深度学习实战
本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考:https://pytorch.org/tutorials/beginn…...

Python - itertools- pairwise函数的详解
前言: 最近在leetcode刷题时用到了重叠对pairwise,这里就讲解一下迭代工具函数pairwise,既介绍给大家,同时也提醒一下自己,这个pairwise其实在刷题中十分有用,相信能帮助到你。 参考官方讲解:itertools --- 为高效循…...

Docker可视化管理工具Portainer
Portainer简介 Portainer 是一个轻量级的、开源的容器管理工具,提供了一个直观的 Web 用户界面(UI),用于管理 Docker 和 Kubernetes 环境。它简化了容器的部署、监控和管理,特别适合不熟悉命令行操作的用户或团队。 …...

WPF实战案例 | C# WPF实现大学选课系统
WPF实战案例 | C# WPF实现大学选课系统 一、设计来源1.1 主界面1.2 登录界面1.3 新增课程界面1.4 修改密码界面 二、效果和源码2.1 界面设计(XAML)2.2 代码逻辑(C#) 源码下载更多优质源码分享 作者:xcLeigh 文章地址&a…...

leetcode 面试经典 150 题:有效的括号
链接有效的括号题序号20题型字符串解法栈难度简单熟练度✅✅✅ 题目 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须…...

python学opencv|读取图像(三十九 )阈值处理Otsu方法
【1】引言 前序学习了5种阈值处理方法,包括(反)阈值处理、(反)零值处理和截断处理,还学习了一种自适应处理方法,相关文章链接为: python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客 python学o…...

GBase8c aes_encrypt和aes_decrypt函数
在数据库中,aes_encrypt和aes_decrypt函数进行加解密时使用的块加密模式。 GBase8c 与 MySQL 的aes_encrypt和aes_decrypt函数区别: 1、GBase8c 中的初始化向量init_vector不能为空 2、MySQL的加密模块block_encryption_mode 为aes-128-ecb,…...

【2024年华为OD机试】(B卷,100分)- 数据分类 (Java JS PythonC/C++)
一、问题描述 题目描述 对一个数据a进行分类,分类方法为: 此数据a(四个字节大小)的四个字节相加对一个给定的值b取模,如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值;如果得到的结果大于或者等于c,则数据a为无效类型。 比如一个数据a=0x010…...

机器学习 vs 深度学习
目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练(归纳)和预测(演绎) 归纳: 从具体案例中抽象一般规律…...

flutter_学习记录_00_环境搭建
1.参考文档 Mac端Flutter的环境配置看这一篇就够了 flutter的中文官方文档 2. 本人环境搭建的背景 本人的电脑的是Mac的,iOS开发,所以iOS开发环境本身是可用的;外加Mac电脑本身就会配置Java的环境。所以,后面剩下的就是&#x…...