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

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 开发效率之困 在当今数字化时代&#xff0c;Java 作为一门广泛应用的编程语言&#xff0c;在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台&#xff0c;还是移动应用后端&#xff0c;都能看到 Java 的身影。然而&#xff0c;Java 开发者…...

多用户商城系统源码哪家好用?怎么选?

想拥有属于自己的多用户商城系统&#xff0c;但回头一看自己又是个技术小白&#xff0c;看着网上眼花缭乱的b2b2c商城系统&#xff0c;更是不知道如何选起&#xff1f;下面给大家分享一条较为成熟的选择思路&#xff0c;以作参考。 1、从需求上决定系统方向 企业在选型b2b2c商…...

聊聊如何实现Android 放大镜效果

一、前言 很久没有更新Android 原生技术内容了&#xff0c;前些年一直在做跨端方向开发&#xff0c;最近换工作用重新回到原生技术&#xff0c;又回到了熟悉但有些生疏的环境&#xff0c;真是感慨万分。 近期也是因为准备做地图交互相关的需求&#xff0c;功能非常复杂&#x…...

NVIDIA视频编解码

开源了两个项目&#xff1a;英伟达显卡视频编解码、jetson视频编解码。都是基于官方SDK进行的封装&#xff0c;由于官方自带的demo晦涩难懂并且每块都是独立的&#xff0c;我对SDK进行二次封装并形成了一套较为完整的视频编解码流程&#xff0c;调用简单&#xff0c;有完整的测…...

Mysql事务隔离级

什么是事务的隔离级别 数据库事务的隔离级别是指事务在并发执行时&#xff0c;如何控制事务之间相互影响的程度。它决定了多个事务并发执行时&#xff0c;事务中的操作对其他事务的可见性&#xff0c;进而影响数据的一致性和并发性。 为什么会有隔离级别的概念&#xff1f; …...

K210视觉识别模块

K210视觉识别模块是一款功能强大的AI视觉模块&#xff0c;以下是对其的详细介绍&#xff1a; 一、核心特性 强大的视觉识别功能&#xff1a;K210视觉识别模块支持多种视觉功能&#xff0c;包括但不限于人脸识别、口罩识别、条形码和二维码识别、特征检测、数字识别、颜色识别…...

springboot使用websocket

文章目录 一、概述1、简介 二、 使用1、引包2、配置处理器3、前端测试 一、概述 1、简介 简介略&#xff0c;附上官方文档&#xff0c;spring5和spring6的官方文档内容大致是一样的&#xff1a; https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framewo…...

线程池底部工作原理

线程池内部是通过线程和队列实现的&#xff0c;当我们通过线程池处理任务时&#xff1a; 如果线程池中的线程数量小于corePoolSize&#xff0c;无论是否有处于空闲的线程&#xff0c;都创建新的线程来处理被添加的任务。 如果线程池中的线程数量等于corePoolSize&#xff0c;…...

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图

在当今数字化飞速发展的时代&#xff0c;开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员&#xff0c;其发展历程与成果备受关注。值此之际&#xff0c;GitCode 精心整理了 DevUI 年度运营报告&#xff0c;为您全面呈现 DevUI 社区在过去一年里的开源之…...

Mybatis面试题

Mybatis面试题 什么是 MyBatis&#xff1f;讲下 MyBatis 的缓存Mybatis 是如何进行分页的&#xff1f;分页插件的原理是什么&#xff1f;简述 Mybatis 的插件运行原理&#xff0c;以及如何编写一个插件&#xff1f;Mybatis 动态 sql 是做什么的&#xff1f;都有哪些动态 sql&am…...

Python获取系统运行时间

有时候想获取系统启动后到现在的运行时间&#xff0c;在Linux C可以使用clock_gettime()来获得&#xff0c;如下&#xff0c; #include <time.h> #include <stdio.h>int main() {struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);printf("syste…...

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介&#xff1a;网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力&#xff1b;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介&#xff1a;系统分…...

【18】Word:明华中学-儿童医保❗

目录 题目​ NO2 NO3 NO4 NO5 NO6 NO7 NO8 NO9 题目 NO2 布局→页面设置对话框→纸张方向&#xff1a;横向→纸张大小&#xff1a;A3 &#xff1b;页面设置对话框&#xff1a;直接输入纸张大小的宽度和高度即可→页面设置对话框&#xff1a;上下左右边距→版式&…...

Vue 中实现修改数组,并保持页面渲染数据是响应式更改

如果你在 Vue 中使用数组并希望确保对数组项的修改是响应式的&#xff0c;直接替换数组项可能不会触发 Vue 的响应式更新。为了确保响应式更新&#xff0c;你可以使用 Vue 提供的 Vue.set() 方法&#xff08;在 Vue 2 中&#xff09;或使用 this.$set() 方法&#xff08;在 Vue…...

MATLAB算法实战应用案例精讲-【数模应用】图形变换和复杂图形组合(附python和MATLAB代码实现)

目录 前言 算法原理 变换 1二维变换 1.1缩放 1.2 翻转 1.3剪切 1.4 旋转 2齐次坐标 2.1引入齐次坐标的原因 2.2 二维齐次坐标 2.3二维仿射变换 2.4逆变换 4组合变换 5三维变换(由二维变换推理而来) 5.1三维齐次坐标 5.2 三维仿射变换 5.3 缩放和平移 5.4…...

GCC支持Objective C的故事?Objective-C?GCC只能编译C语言吗?Objective-C 1.0和2.0有什么区别?

GCC支持Objective C的故事 Objective-C 主要由 Stepstone 公司的Brad Cox和 Tom Love 在1980 年左右发明。乔布斯离开苹果公司后成立了NeXT STEP公司&#xff0c; 买下了Objective-C 语言的授权。GCC对Objective-C语言的支持是在1992年加入的&#xff0c;具体是在GCC 1.3版本中…...

自动驾驶占用网格预测

文章目录 需要阅读的文献&#xff1a;github论文仓库论文idea提取BEVFormer 需要阅读的文献&#xff1a; ⭐[ECCV 2024] SparseOcc 纯稀疏3D占用网络和 RayIoU 评估指标 ECCV 2024&#xff5c;OSP&#xff1a;自动驾驶全新建模方法&#xff0c;端到端输出任意位置的占用结果 S…...

1.17组会汇报

STRUC-BENCH: Are Large Language Models Good at Generating Complex Structured Tabular Data? STRUC-BENCH&#xff1a;大型语言模型擅长生成复杂的结构化表格数据吗&#xff1f;23年arXiv.org 1概括 这篇论文旨在评估大型语言模型&#xff08;LLMs&#xff09;在生成结构…...

使用 Ansys Motor-CAD 的自适应模板加速创新

应对现代电机设计挑战 电机设计不断发展&#xff0c;Ansys 正在通过创新解决方案引领潮流&#xff0c;不断突破可能的界限。随着电动汽车、工业自动化和可再生能源系统的快速增长&#xff0c;对优化电机的需求从未如此之高。工程师面临着越来越大的压力&#xff0c;他们需要开发…...

用nginx正向代理https网站

目录 1. 缘起2. 部署nginx3. 测试3.1 http测试3.2 https测试4 给centos设置代理访问外网 1. 缘起 最近碰到了一个麻烦事情&#xff0c;就是公司的centos测试服务器放在内网环境&#xff0c;而且不能直接上外网&#xff0c;导致无法通过yum安装软件&#xff0c;非常捉急。 幸…...

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件&#xff0c;但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别&#xff1a; 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…...

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…...

StarRocks 怎么让特定的SQL路由到FE master节点的

背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的&#xff0c;而只有master节点才能对元数据进行写操作。但是为什么呢&#xff1f;哪里有体现呢&#xff1f; 这其中的原因在网上是搜不到的&#xff0c;所以大家只知道只有master节点才…...

蓝桥杯真题 - 公因数匹配 - 题解

题目链接&#xff1a;https://www.lanqiao.cn/problems/3525/learning/ 个人评价&#xff1a;难度 2 星&#xff08;满星&#xff1a;5&#xff09; 前置知识&#xff1a;调和级数 整体思路 题目描述不严谨&#xff0c;没说在无解的情况下要输出什么&#xff08;比如 n n n …...

Java 8 Stream API

文章目录 Java 8 Stream API1. Stream2. Stream 的创建3. 常见的 Stream 操作3.1 中间操作3.2 终止操作 4. Stream 的并行操作 Java 8 Stream API Java 8 引入了 Stream API&#xff0c;使得对集合类&#xff08;如 List、Set 等&#xff09;的操作变得更加简洁和直观。Stream…...

AI刷题-还原原始字符串、大数和中的极值位距离

目录 一、还原原始字符串 问题描述 举例 输入格式 输出格式 输入 输出 输入 输出 输入 输出 输入 输出 输入 输出 输入 输出 数据范围 解题思路&#xff1a; 数据结构选择 最终代码&#xff1a; 运行结果&#xff1a; 二、大数和中的极值位距离 问题…...

Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示

Ubuntu20.04默认情况下为root账号自动登录&#xff0c;本文介绍如何取消root账号自动登录&#xff0c;改为通过输入账号密码登录&#xff0c;使用触觉智能EVB3568鸿蒙开发板演示&#xff0c;搭载瑞芯微RK3568&#xff0c;四核A55处理器&#xff0c;主频2.0Ghz&#xff0c;1T算力…...

MySQL 数据库 :SQL 语句规约(不得使用外键与级联,一切外键概念必须在应用层解决。)

文章目录 I 强制规约表名限定数据订正禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。不得使用外键与级联,一切外键概念必须在应用层解决。使用 ISNULL() 来判断是否为 NULL 值NPE 问题不要使用 count(列名) 或 count(常量) 来替代 count(*)II 建议in 操作能避免则…...

深入理解 SQL 中的 DATEDIFF 函数

深入理解 SQL 中的 DATEDIFF 函数 DATEDIFF 函数在 SQL 中是一个用于计算两个日期之间差值的重要工具。不同数据库实现了不同版本的 DATEDIFF&#xff0c;它们在功能和语法上有所不同。本文将详细解析 DATEDIFF 的用法、数据库间差异、复杂场景中的应用&#xff0c;以及替代方…...

【Linux】15.Linux进程概念(4)

文章目录 程序地址空间前景回顾C语言空间布局图&#xff1a;代码1代码2代码3代码4代码5代码6代码7 程序地址空间前景回顾 历史核心问题&#xff1a; pid_t id fork(); if(id 0) else if(id>0) 为什么一个id可以放两个值呢&#xff1f;之前没有仔细讲。 C语言空间布局图&am…...

KubeSphere部署安装,接入KubeKey安装的k8s集群

KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…...

opencv3.4 ffmpeg3.4 arm-linux 交叉编译

一些依赖安装&#xff1a; sudo apt-get install pkg-config libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev 交叉编译工具链准备&#xff1a;gcc-linaro-6.3.1 1、下载 https://github.com/FFmpeg/FFmpeg 解压后新建目录&#xff1a;Fmpeg-n3.4.13/ffmpeg…...

Java基础(二)

提示:这部分内容对逆向重要,需重点掌握。 1.常见数据类型 1.1 List系列 类似于Python中的列表 List是一个接口,接口下面有两个常见的类型(目的是可以存放动态的多个数据) ArrayList,连续的内存地址存储(内部自动扩容) -> Python列表的特点LinkedList,底层基于链表…...

网络IO与IO多路复用

一、网络IO基础 系统对象&#xff1a; 网络IO涉及用户空间调用IO的进程或线程以及内核空间的内核系统。例如&#xff0c;当进行read操作时&#xff0c;会经历两个阶段&#xff1a; 等待数据准备就绪。将数据从内核拷贝到进程或线程中。 多种网络IO模型的出现原因&#xff1a;…...

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…...

【机器学习实战入门】使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…...

Android SystemUI——StatusBar视图创建(六)

上一篇文章我们介绍了 StatusBar 的构建过程,在 makeStatusBarView() 中获得 FragmentHostManager,用来管理 StatusBar 的窗口。 一、状态栏视图 在得到 FragmentHostManager 实例对象之后,还会继续调用 addTagListener() 方法设置监听对象,然后获取 FragmentManager 并开…...

解决 Error: Invalid or corrupt jarfile day04_studentManager.jar 报错问题

在 Java 开发过程中&#xff0c;我们可能会遇到这样的报错信息&#xff1a;Error: Invalid or corrupt jarfile day04_studentManager.jar。这个错误通常表示 day04_studentManager.jar 文件可能已损坏或无效&#xff0c;下面将为大家详细介绍如何解决这个问题。 一、错误点分…...

《MambaIR:一种基于状态空间模型的简单图像修复基线方法》学习笔记

paper&#xff1a;2402.15648 目录 摘要 一、引言 1、模型性能的提升依赖于网络感受野的扩大&#xff1a; 2、全局感受野和高效计算之间存在固有矛盾&#xff1a; 3、改进版 Mamba的巨大潜力 4、Mamba 在图像修复任务中仍面临以下挑战&#xff1a; 5、方法 6、主要贡献…...

【转】厚植根基,同启新程!一文回顾 2024 OpenHarmony 社区年度工作会议精彩瞬间

在数字化浪潮奔腾不息的今天&#xff0c;开源技术已成为推动科技创新与产业发展的强大引擎。2025年1月10日-11日&#xff0c;OpenAtom OpenHarmony&#xff08;开放原子开源鸿蒙&#xff0c;以下简称“OpenHarmony”或“开源鸿蒙”&#xff09;社区2024年度工作会议于深圳盛大启…...

2024年我的技术成长之路

2024年我的技术成长之路 大家好&#xff0c;我是小寒。又到年底了&#xff0c;一年过得真快啊&#xff01;趁着这次活动的机会&#xff0c;和大家聊聊我这一年在技术上的收获和踩过的坑。 说实话&#xff0c;今年工作特别忙&#xff0c;写博客的时间比去年少了不少。不过还是…...

最长递增子序列问题(Longest Increasing Subsequence),动态规划法解决,贪心算法 + 二分查找优化

问题描述&#xff1a;在一个大小乱序的数列中&#xff0c;找到一个最大长度的递增子序列&#xff0c;子序列中的数据在原始数列中的相对位置保持不变&#xff0c;可以不连续&#xff0c;但必须递增。 输入描述&#xff1a; 第一行输入数列的长度 n。(1 < n < 200) 第二…...

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…...

基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day2

为了使 2048 游戏的设计更加美观和用户友好&#xff0c;我们可以进行以下几项优化&#xff1a; 改善颜色方案&#xff1a;使用更温馨的颜色组合。添加动画效果&#xff1a;为方块的移动和合并添加渐变效果。优化分数显示&#xff1a;在分数增加时使用动画效果。 以下是改进后…...

服务化架构 IM 系统之应用 MQ

在微服务化系统中&#xff0c;存在三个最核心的组件&#xff0c;分别是 RPC、注册中心和MQ。 在前面的两篇文章&#xff08;见《服务化架构 IM 系统之应用 RPC》和《服务化架构 IM 系统之应用注册中心》&#xff09;中&#xff0c;我们站在应用的视角分析了普适性的 RPC 和 注…...

IoTDB 常见问题 QA 第四期

关于 IoTDB 的 Q & A IoTDB Q&A 第四期来啦&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;Java 中如何使用 SSL 连接 IoTDB 问题…...

Objective-C语言的数据类型

Objective-C数据类型详解 Objective-C是一种面向对象的编程语言&#xff0c;主要用于macOS和iOS应用程序的开发。作为C语言的超集&#xff0c;Objective-C继承了C语言的基本数据类型&#xff0c;同时也引入了一些独特的特性。本文将对Objective-C的各种数据类型进行详细的介绍…...

3d系统误差分析

系统标定重投影误差预估 在计算机视觉和三维重建领域中&#xff0c;评估一个相机系统标定精度的重要指标。通过比较真实的三维点在图像中的投影位置与标定模型计算出的投影位置之间的差异&#xff0c;来衡量标定的准确性。 以下是对这一概念的详细解析&#xff1a; 什么是系统…...

单片机的原理及其应用:从入门到进阶的全方位指南

以下是一篇详细、深入的“单片机的原理及其应用”博客文章示例&#xff0c;适合想要系统学习或深入了解单片机的读者。文中不仅会介绍单片机的基本原理、内部构造、开发流程和应用领域&#xff0c;还会融入更多的理论分析、实操案例以及常见问题与解决思路等&#xff0c;帮助读…...

在.NET用C#将Word文档转换为HTML格式

将Word文档转换为HTML格式尤其具有显著的优势&#xff0c;它不仅能够确保文档内容在多种设备和平台上保持一致灵活的显示&#xff0c;还便于通过网络进行传播和集成到各种Web应用中。随着越来越多的企业和开发者寻求更灵活、更具兼容性的文件处理方式&#xff0c;.NET框架下的C…...