Wend看源码-Java-Arrays 工具集学习
摘要
java.util.Arrays
是 Java 标准库中的一个实用工具类,它提供了各种静态方法来操作数组,包括排序、搜索、比较、填充等。这些方法简化了对数组的操作,并且在很多情况下可以提高代码的可读性和效率。以下是关于Arrays类中提供的一些主要方法的总结。
Sort(排序)
对指定的数组进行升序排序。Collection接口和List 接口中的 sort 方法都是基于Arrays.sort方法实现的。 当你调用Arrays.sort()
时,内部逻辑会自动选择最适合输入数据类型的排序算法:
- 对于对象数组(实现了
Comparable
接口的对象),它使用ComparableTimSort
。 - 对于带有显式比较器的对象数组,它也使用TimSort,但是通过提供比较器来进行元素间的比较。
- 对于基本类型的数组(例如
int[]
,double[]
等),它使用DualPivotQuicksort。
示例代码
package person.wend.javalearnexample.util;public class ArraysExample {public static void main(String[] args) {numberSort();objectSort();}public static void numberSort() {// 数字排序int[] numbers = { 3, 1, 4, 1, 5, 9, 2, 6 };java.util.Arrays.sort(numbers);for (int i : numbers) {System.out.print(i + " ");}System.out.println();}public static void objectSort(){// 对象排序String[] strings = { "Hello", "World", "Java" };java.util.Arrays.sort(strings);for (String s : strings) {System.out.print(s + " ");}System.out.println();}
}
排序算法 TimSort
TimSort是一种混合排序算法,源自合并排序和插入排序。它是由Tim Peters在2002年为Python编程语言发明的,并且后来被Java采用作为默认的排序算法(从Java 7开始)。TimSort旨在利用真实世界数据中常见的模式来提高性能。它首先识别出已经有序的数据段(称为“runs”),然后以一种高效的方式合并这些段。对于大多数实际数据集来说,TimSort的表现非常好,其平均和最坏情况下的时间复杂度都是O(n log n)。
ComparableTimSort
ComparableTimSort
是TimSort的一个变体,专门用于处理实现了Comparable
接口的对象数组或列表。这意味着数组中的元素能够自行比较大小,不需要额外提供比较器。Java的Arrays.sort(T[] a)
和List.sort(Comparator<? super T> c)
(当没有提供自定义比较器时)使用这个变体。
排序算法 DualPivotQuicksort
DualPivotQuicksort是快速排序的一种变体,由Vladimir Yaroslavskiy提出,用于改进传统的单轴快速排序。与标准的快速排序不同,它选择了两个枢轴点而不是一个,从而将数组分为三个部分。这种算法通常比传统快速排序更有效率,特别是对于包含大量重复元素的数据集。从Java 7开始,Arrays.sort()
对基本类型(如int、double等)使用了DualPivotQuicksort。
binarySearch(二分搜索)
Arrays.binarySearch()
用于在一个已经排序的数组中执行二分查找(binary search)。该方法可以对基本类型数组和对象数组进行高效的搜索。对于对象数组,要求这些对象实现了 Comparable
接口或者提供了一个 Comparator
来定义元素之间的比较规则。
示例代码
public static void binarySearch() {// 创建一个整数数组int[] numbers = {3, 6, 2, 8, 4, 7, 5, 1};// 使用 binarySearch 查找元素 5int index = Arrays.binarySearch(numbers, 5);// 打印查找结果System.out.println("元素 5 的索引位置为:" + index);}
注意事项
-
数组必须是已排序的。如果数组没有排序,那么结果是不确定的,可能会返回错误的结果。
-
对于对象数组,数组中的元素类型必须实现
Comparable
接口,这样才能确定元素之间的大小关系,以便进行二分查找。如果没有实现Comparable
接口,会在运行时抛出ClassCastException
异常。
equals
Arrays.equals()
用于比较两个一维数组的内容是否相等。它会逐一比较两个数组中的元素,如果所有对应位置上的元素都相等,则返回 true
;否则返回 false
。对于多维数组,equals()
只比较顶层元素的引用,而不是递归地比较内部数组的内容。
deepEquals
Arrays.deepEquals()
方法不仅比较顶层元素,还会递归地比较多维数组中每个子数组的内容,直到所有的嵌套层级都被检查完毕。这对于包含其他数组的对象数组来说是非常有用的,因为它确保了整个结构的深度相等性。
示例代码
public static void equalsTest(){int[] array1 = {1, 2, 3};int[] array2 = {1, 2, 3};int[] array3 = {3, 2, 1};// 比较两个相同内容的一维数组System.out.println("array1 and array2 are equal: " + Arrays.equals(array1, array2)); // true// 比较两个不同顺序的一维数组System.out.println("array1 and array3 are equal: " + Arrays.equals(array1, array3)); // false// 对于对象类型的数组,比较的是对象的内容(假设实现了正确的 equals 方法)String[] stringArray1 = {"hello", "world"};String[] stringArray2 = {"hello", "world"};System.out.println("stringArray1 and stringArray2 are equal: " + Arrays.equals(stringArray1, stringArray2)); // trueInteger[][] array4 = {{1, 2}, {3, 4}};Integer[][] array5 = {{1, 2}, {3, 4}};Integer[][] array6 = {{1, 2}, {4, 3}};// 使用 Arrays.deepEquals() 比较两个相同内容的二维数组System.out.println("array1 and array2 are deeply equal: " + Arrays.deepEquals(array4, array5)); // true// 使用 Arrays.deepEquals() 比较两个不同内容的二维数组System.out.println("array1 and array3 are deeply equal: " + Arrays.deepEquals(array4, array6)); // false// 对于更复杂的数据结构,比如包含其他数组的对象数组Object[] complexArray1 = new Object[]{"hello", new Integer[]{1, 2}, new String[]{"a", "b"}};Object[] complexArray2 = new Object[]{"hello", new Integer[]{1, 2}, new String[]{"a", "b"}};System.out.println("complexArray1 and complexArray2 are deeply equal: " + Arrays.deepEquals(complexArray1, complexArray2)); // true}
fill
Arrays.fill()
方法用于将指定的值填充到整个数组或数组的一部分。它是一个非常方便的方法,可以快速初始化数组或更新现有数组的内容,而不需要使用循环来逐个设置元素。
示例代码
public static void fillTest() {// 创建一个整型数组并用 7 填充int[] numbers = new int[5];Arrays.fill(numbers, 7);System.out.println("Filled array with 7: " + Arrays.toString(numbers)); // [7, 7, 7, 7, 7]// 创建一个字符串数组并用 "hello" 填充String[] greetings = new String[3];Arrays.fill(greetings, "hello");System.out.println("Filled string array: " + Arrays.toString(greetings)); // [hello, hello, hello]// 创建一个整型数组并部分填充int[] numbers2 = {1, 2, 3, 4, 5};Arrays.fill(numbers2, 1, 4, 8); // 从索引 1 到 3(不包括 4)的元素被替换为 8System.out.println("Partially filled array: " + Arrays.toString(numbers2)); // [1, 8, 8, 8, 5]// 创建一个字符数组并部分填充char[] chars = {'a', 'b', 'c', 'd', 'e'};Arrays.fill(chars, 2, 5, 'z'); // 从索引 2 到 4(不包括 5)的元素被替换为 'z'System.out.println("Partially filled char array: " + Arrays.toString(chars)); // [a, b, z, z, z]}
copyOf
Arrays.copyOf
方法用于复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度。如果原数组的长度小于新数组的长度,则填充 null(对于对象数组)或相应的默认值(对于基本类型数组,比如 0、false 等)。如果原数组的长度大于新数组的长度,则只复制指定长度内的元素。
copyOfRange
Arrays.copyOfRange
方法用于复制指定数组的指定范围到新数组中。这个方法允许你指定开始索引(包含)和结束索引(不包含)来复制数组的一部分。
示例代码
public static void copyOfTest() {String[] original = {"Apple", "Banana", "Cherry", "Date"};String[] copy = Arrays.copyOf(original, 2); // 复制前两个元素System.out.println(Arrays.toString(copy)); // 输出: [Apple, Banana]String[] longerCopy = Arrays.copyOf(original, 6); // 原数组长度小于新长度,填充nullSystem.out.println(Arrays.toString(longerCopy)); // 输出: [Apple, Banana, Cherry, Date, null, null]// copyOfRangeString[] copyRange = Arrays.copyOfRange(original, 1, 3); // 复制索引1到索引2(不包括索引3)的元素System.out.println(Arrays.toString(copyRange)); // 输出: [Banana, Cherry]}
asList
Arrays.asList()
用于将一个数组转换为一个固定大小的List
集合。这个方法提供了一种便捷的方式,使得可以使用一些List
接口的方法来操作数组元素。
示例代码
- 基本数据类型数组转换:对于基本数据类型数组,如
int[]
、double[]
等,基本数据类型数组在作为可变参数传递时,被视为一个单独的对象。
int[] intArray = {1, 2, 3};
List<int[]> list = Arrays.asList(intArray);
// 此时list中只有一个元素,就是intArray这个数组本身
System.out.println(list.size()); // 输出1
- 如果要将基本数据类型数组转换为包含基本数据类型元素的
List
,可以先将基本数据类型数组转换为对应的包装类型数组,例如:
Integer[] integerArray = new Integer[intArray.length];
for (int i = 0; i < intArray.length; i++) {integerArray[i] = intArray[i];
}
List<Integer> integerList = Arrays.asList(integerArray);
System.out.println(integerList.size()); // 输出3
- 对象数组转换示例:对于对象数组,使用就比较直接。例如,对于
String
数组:
String[] stringArray = {"apple", "banana", "cherry"};
List<String> stringList = Arrays.asList(stringArray);
System.out.println(stringList.size()); // 输出3
System.out.println(stringList.get(1)); // 输出banana
hashCode
Arrays.hashCode()
方法为单层数组计算哈希码。该方法会遍历数组中的每一个元素,并将这些元素的哈希码组合成一个单一的哈希值。这个过程确保了即使两个不同的数组实例包含相同的元素序列,它们也会有相同的哈希码,从而可以正确地用作哈希表中的键或集合中的成员。
deepHashCode
Arrays.deepHashCode()
方法则进一步处理多维数组,递归地计算每个子数组的哈希码。这对于包含其他数组的对象数组特别有用,因为它不仅考虑顶层元素,还深入到每一层嵌套的数组,确保整个结构的内容都被纳入哈希码的计算之中。
示例代码
public static void hashCodeTest(){// 计算字符串数组的哈希码String[] array1 = {"apple", "banana", "cherry"};System.out.println("Hash code of array1: " + Arrays.hashCode(array1));// 对于基本类型数组,使用相应的 hashCode 方法int[] numbers = {1, 2, 3};System.out.println("Hash code of numbers: " + Arrays.hashCode(numbers));// 示例 2 deepHashCode// 创建一个二维字符串数组并计算其深哈希码String[][] array2D = {{"apple", "banana"}, {"cherry", "date"}};System.out.println("Deep hash code of 2D array: " + Arrays.deepHashCode(array2D));// 对于更复杂的数据结构,比如包含其他数组的对象数组Object[] complexArray = new Object[]{"hello", new Integer[]{1, 2}, new String[]{"a", "b"}};System.out.println("Deep hash code of complex array: " + Arrays.deepHashCode(complexArray));}
toString
toString
方法用于返回指定数组内容的字符串表示形式。该方法适用于任何类型的数组,包括基本类型数组和对象数组。
deepToString
deepToString
方法用于返回多维数组(即数组的数组)的字符串表示形式。当数组是嵌套的,toString
方法只能打印出最外层数组的引用,而 deepToString
能够递归地打印出所有层的元素。
示例代码
public static void toStringTest(){int[] array = {1, 2, 3, 4, 5};String arrayString = Arrays.toString(array);System.out.println(arrayString); // 输出: [1, 2, 3, 4, 5]int[][] deepArray = {{1, 2}, {3, 4, 5}, {6}};String deepArrayString = Arrays.deepToString(deepArray);System.out.println(deepArrayString); // 输出: [[1, 2], [3, 4, 5], [6]]}
JDK 8 新增方法
parallelSort(并发排序)
Arrays.parallelSort
是 Java 8+ 标准库提供的一个方法,用于对数组进行并行排序。它利用了 Java 的 Fork/Join 框架来实现多线程并行处理,可以加速大数组的排序操作。与 Arrays.sort()
不同,parallelSort()
方法旨在充分利用多核处理器的能力来提高性能。
示例代码
import java.util.Arrays;public class ParallelSortExample {public static void main(String[] args) {int[] array = {5, 2, 8, 1, 9, 3};// 使用 parallelSort() 对数组进行排序Arrays.parallelSort(array);// 输出排序后的数组System.out.println(Arrays.toString(array));}
}
ArraysParallelSortHelpers
这个类被用于辅助Arrays.parallelSort的实现,
包含了用于并行排序的辅助方法和静态内部类。ArraysParallelSortHelpers
主要用于将排序任务分割成更小的任务,并在多个处理器核心上并行执行它们。
-
任务分割:
ArraysParallelSortHelpers
将大数组分割成多个子数组,每个子数组可以由一个单独的线程进行排序。 -
任务合并:在子数组被排序后,
ArraysParallelSortHelpers
提供了合并这些子数组的方法,以生成最终排序好的大数组。 -
工作窃取算法:为了提高效率,
ArraysParallelSortHelpers
使用了工作窃取算法。这意味着空闲的线程可以从其他忙碌线程的任务队列中“窃取”任务。
parallelSort 与Sort 对比
-
单线程 vs. 多线程:
sort()
是一个单线程方法,而parallelSort()
则会创建多个线程来进行并行排序。 -
性能差异:对于较小的数组,
sort()
可能比parallelSort()
更快,因为后者需要额外的开销来设置和管理线程池。然而,对于较大的数组,parallelSort()
可以通过多线程并发执行来提供更好的性能。 -
排序算法:
sort()
对于原始类型(如 int, long 等)使用双轴快速排序算法,对于对象数组则使用 TimSort 算法。parallelSort()
在内部根据情况选择适当的算法,并且为了并行化可能会使用不同的策略。 -
使用场景
-
sort()
:适用于小规模数据集或者当你的应用程序已经有很多活跃线程时,避免引入更多线程带来的额外开销。 -
parallelSort()
:适用于大规模数据集并且运行在多核处理器上的环境,能够从多线程中受益以减少排序时间。
-
parallelPrefix(前缀计算)
Arrays.parallelPrefix()
方法是 Java 8 中引入的一个并行数组操作方法。它用于对给定的数组进行前缀计算,计算方式是基于一个指定的二元操作符。该方法可以利用多核处理器的并行计算能力,在合适的场景下提高计算效率。
工作原理
-
假设我们有一个数组
[a, b, c, d]
,在执行parallelPrefix
操作时,对于二元操作符op
,计算过程如下: -
首先,计算第一个元素和第二个元素的结果,即
newArray[1]=op.apply(array[0], array[1])
,新数组的第一个元素通常保持不变(取决于操作符)。 -
然后,计算新的第二个元素和第三个元素的结果,即
newArray[2]=op.apply(newArray[1], array[2])
。 -
以此类推,最后得到一个经过前缀计算后的数组。例如,如果操作符是加法,对于数组
[1, 2, 3, 4]
,计算后的数组为[1, 1 + 2, (1 + 2)+3, ((1 + 2)+3)+4]
,即[1, 3, 6, 10]
。
示例代码
public static void parallelPrefixTest(){// 创建一个整数数组int[] numbers = {1, 2, 3, 4, 5};// 使用 parallelPrefix 计算数组的前缀和Arrays.parallelPrefix(numbers, (left, right) -> left + right);// 打印计算结果System.out.println(Arrays.toString(numbers));}
setAll(设置新值)
Arrays.setAll()
方法使用单线程来顺序地为数组中的每一个位置设置一个新值。它接受一个数组和一个 IntUnaryOperator
接口的实例作为参数,后者定义了一个操作,该操作接收一个整数参数(即数组索引)并返回一个新的整数值来填充对应的数组位置。
parallelSetAll(并行设置新值)
Arrays.parallelSetAll()
方法与 setAll()
类似,但它利用 Java 的 Fork/Join 框架来并行化任务执行,从而加速大数组的填充过程。这个方法会尝试将数组分割成多个部分,并在不同的线程上同时应用生成器函数来填充这些部分。对于小数组或者只有一个处理器核心的情况下,parallelSetAll()
可能不会提供性能优势,甚至可能比 setAll()
更慢,因为并行处理引入了额外的开销。
示例代码
public static void setAllExample(){// 使用 setAll 初始化一个整型数组,每个元素是其索引的平方int[] squares = new int[5];Arrays.setAll(squares, i -> i * i);System.out.println("Squares: " + Arrays.toString(squares)); // [0, 1, 4, 9, 16]// 使用 setAll 初始化一个字符串数组,每个元素是其索引的字符表示String[] indexedStrings = new String[3];Arrays.setAll(indexedStrings, Integer::toString);System.out.println("Indexed strings: " + Arrays.toString(indexedStrings)); // [0, 1, 2]// 使用 parallelSetAll 并行初始化一个大整型数组,每个元素是其索引的立方int[] cubes = new int[1000000];Arrays.parallelSetAll(cubes, i -> i * i * i);// 打印前五个元素作为示例System.out.println("First five cubes: " + Arrays.toString(Arrays.copyOfRange(cubes, 0, 5))); // [0, 1, 8, 27, 64]// 对于对象数组,可以使用更复杂的生成逻辑String[] complexObjects = new String[10];Arrays.parallelSetAll(complexObjects, i -> "Object-" + i);System.out.println("Complex objects: " + Arrays.toString(complexObjects));}
spliterator
spliterator
是 Java 8 中引入的一个方法,用于获取数组的可拆分迭代器(Spliterator)。Spliterator 是一个用于遍历和分割数据源的接口,它可以用于并行处理数据。Arrays
类中的spliterator
方法提供了一种机制,使得可以将数组元素以一种能够支持并行处理的方式进行迭代。
-
该方法返回一个
Spliterator
接口的实现对象,这个对象可以用于遍历数组元素。它支持多种操作,如tryAdvance
(逐个元素尝试前进并执行操作)、forEachRemaining
(对剩余元素执行操作)等。 -
更重要的是,Spliterator 可以被分割,这对于并行处理非常关键。例如,在并行流处理中,可以将数据源分割成多个部分,每个部分可以由不同的线程处理,从而提高处理效率。它有一个
trySplit
方法,用于尝试将 Spliterator 分割成两个部分。如果分割成功,返回一个新的 Spliterator 代表分割后的一部分,原 Spliterator 则代表另一部分;如果无法分割(如数组元素太少等情况),则返回null
。
示例代码
public static void spliteratorExample() {// 创建一个整数数组int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用 spliterator() 方法创建一个 Spliterator 对象java.util.Spliterator<Integer> spliterator = Arrays.spliterator(numbers);// 使用 tryAdvance() 方法遍历 SpliteratorSystem.out.println("Traversing the Spliterator:");spliterator.tryAdvance(System.out::println);// 使用 forEachRemaining() 方法遍历剩余元素spliterator.forEachRemaining(System.out::println);// 使用 trySplit() 方法拆分 Spliteratorjava.util.Spliterator<Integer> split = spliterator.trySplit();// 使用 tryAdvance() 方法遍历拆分后的 SpliteratorSystem.out.println("Traversing the split Spliterator:");if (split != null) {split.tryAdvance(System.out::println);split.forEachRemaining(System.out::println);}// 使用 estimateSize() 方法获取剩余元素数量System.out.println("Remaining elements in the original Spliterator: " + spliterator.estimateSize());// 使用 characteristics() 方法获取 Spliterator 的特性System.out.println("Characteristics of the original Spliterator: " + spliterator.characteristics());// 使用 getExactSizeIfKnown() 方法获取确切元素数量System.out.println("Exact size of the original Spliterator: " + spliterator.getExactSizeIfKnown());// 使用 hasCharacteristics() 方法检查 Spliterator 的特性System.out.println("The original Spliterator is SIZED: " + spliterator.hasCharacteristics(java.util.Spliterator.SIZED));}
stream
stream
方法是 Java 8 中非常重要的一个特性相关的方法,它允许将数组转换为流(Stream)。流是一种用于处理元素序列的高级抽象,支持一系列的中间操作(如filter
、map
等)和终端操作(如forEach
、reduce
等),可以让开发者以一种更函数式的方式来处理数据。
示例代码
public static void streamTest(){String[] stringArray = {"apple", "banana", "cherry", "date"};Stream<String> stream = Arrays.stream(stringArray);stream.filter(str -> str.length() > 5).map(String::toUpperCase).forEach(System.out::println);}
在这个示例中,首先将String
数组stringArray
转换为Stream<String>
,然后使用filter
操作过滤出长度大于5
的字符串(这里只有banana
和cherry
),接着使用map
操作将过滤后的字符串转换为大写形式,最后使用forEach
操作将结果打印出来,输出为BANANA
和CHERRY
。
JDK 9 新增方法
compare
Arrays.compare()
方法用于比较两个数组。它会根据数组中元素的顺序,从第一个元素开始逐个比较,直到找到不同的元素或者遍历完整个数组。这个方法返回一个整数值来表示两个数组的大小关系,返回值的规则遵循Comparator
接口的一般约定。
compareUnsigned
Arrays.compareUnsigned()
方法主要用于无符号比较两个数组,特别是在处理无符号数据类型(如byte
、short
、int
、long
)时非常有用。它和compare
方法类似,但在比较过程中会将数据视为无符号数。
示例代码
public static void compareTest(){int[] array1 = {1, 2, 3};int[] array2 = {1, 2, 4};int result = Arrays.compare(array1, array2);System.out.println("比较结果: " + result);// 示例 2 compareUnsignedint result2 = Arrays.compareUnsigned(array1, array2);System.out.println("比较结果(无符号比较): " + result2);}
mismatch
mismatch()
方法用于比较两个数组,并找到第一个不匹配(即元素值不同的位置)。如果两个数组在所有对应位置上的元素都相等,则返回 -1
;否则,返回第一个不同元素的索引。对于长度不同的数组,mismatch()
会返回较短数组的长度,因为超出部分默认视为不匹配。
mismatch()
方法适用于基本类型数组和对象数组,并且能够处理多维数组的情况。它提供了一种高效的方式来定位两个数组之间的差异点,这对于调试、测试以及数据验证等场景非常有用。
示例代码
public static void missMatchTest() {// 创建两个整型数组进行比较int[] array1 = {1, 2, 3, 4, 5};int[] array2 = {1, 2, 0, 4, 5};// 使用 mismatch 查找第一个不匹配的位置int index = Arrays.mismatch(array1, array2);System.out.println("First mismatch at index: " + index); // 输出 2,因为第三个元素不同// 如果两个数组完全相同int[] array3 = {1, 2, 3, 4, 5};index = Arrays.mismatch(array1, array3);System.out.println("First mismatch at index: " + index); // 输出 -1,表示没有不匹配的地方}
参考文献/AIGC
通义tongyi.ai_你的全能AI助手-通义千问
豆包
相关推荐
JavaUsefulMode: 基于Java 语言的自定义实用工具集
JavaUsefulMode是小编编写Java方向学习专栏时的代码示例汇总总结,其中内容包含了该篇文章所涉及的Java代码示例。感兴趣的小伙伴可以直接下载学习。
Wend看源码-Java.util 工具类学习(上)-CSDN博客
Wend看源码-Java.util 工具类学习(下)-CSDN博客
Wend看源码-Java-Collections 工具集学习-CSDN博客
Wend看源码-Java-Executor异步执行器学习-CSDN博客
Wend看源码-Java-fork/Join并行执行任务框架学习-CSDN博客
相关文章:
Wend看源码-Java-Arrays 工具集学习
摘要 java.util.Arrays 是 Java 标准库中的一个实用工具类,它提供了各种静态方法来操作数组,包括排序、搜索、比较、填充等。这些方法简化了对数组的操作,并且在很多情况下可以提高代码的可读性和效率。以下是关于Arrays类中提供的一些主要方…...
【算法复健】0102 快速选择算法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、算法引入1. 冒泡排序2.快速排序3. 快速选择(1)题目:数组中的第K个最大元素(2)代码 前言 本文由快速排序算法引入快速选…...
【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?
今天在开发一个HarmonyOS NEXT的应用的时候,发现http接口如果返回的状态码是424时,我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现: 我的拦截器代码如下: 解决办法: 先说解决办法ÿ…...
口语笔记——使动词
每个使动词都可以有三种形式,以move为例: move作为动词可表达:使……感动,让……感动,通常用于主谓宾结构。ed作为形容词可表达:感动的,通常用于主系表结构。ing作为形容词可表达:令…...
SQL-leetcode-196. 删除重复的电子邮箱
196. 删除重复的电子邮箱 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 编写解…...
汇编语言:从键盘输入数字字符,(计算阶乘),以无符号十进制形式输出(分支、循环程序)
1.分支结构原理 分支结构是汇编语言中的一种基本控制结构,它允许程序根据条件选择执行不同的路径。分支结构通常通过跳转(jump)指令来实现。 条件判断: 汇编语言中的条件判断通常通过比较(compare)指令来实…...
汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%
汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型损坏: 前挡风玻璃(damage-front-windscreen ) 损坏的门 (damaged-d…...
python的urllib模块和http模块
1.python的urllib库用于操作网页,并对网页内容进行处理 urllib包有如下模块: urllib.request:打开和读取URL urllib.error: 包含urllib.request抛出的异常 urllib.parse: 解析URL urllib.robotparser࿱…...
Codigger集成Copilot:智能编程助手
在信息技术的快速发展中,编程效率和创新能力的提升成为了开发者们追求的目标。Codigger平台通过集成Copilot智能编程助手,为开发者提供了一个强大的工具,以增强其生产力、创新力和技能水平。本文将深入探讨Codigger与Copilot的集成如何为IT专…...
快递物流查询API接口推荐
针对快递物流查询API接口及行政区划解析的需求,以下是一些推荐和解析: ### 一、快递物流查询API接口推荐 1. **ShowAPI** * **功能**:支持国内外1500快递物流公司的物流跟踪服务,包括顺丰、圆通、申通、中通、韵达等主流快递公司…...
【Unity3D】3D渲染流水线总结
3D渲染流水线: CPU阶段(应用阶段): 1、加载数据:硬盘->内存->显存 场景数据从硬盘HDD加载到内存RAM,网格和纹理等数据会再次加载到显存VRAM,显卡对显存访问速度更快。 2、设置渲染状态…...
LevelDB 源码阅读:利用 Clang 的静态线程安全分析
LevelDB 中有一些宏比较有意思,平时自己写代码的时候,还基本没用过。这些宏在 thread_annotations.h 中定义,可以在编译时使用 Clang 编译器的线程安全分析工具,来检测潜在的线程安全问题。 比如下面这些宏,到底有什么…...
不只是工具:ChatGPT写作在学术中的创新思维与深度思考
目录 1.数据选择与质量 2.Prompt技巧 1.明确任务 2.上下文信息 3.好的示例 3.后期编辑与润色 随着AIGC技术的迅猛发展和不断升级,AI写作正逐渐成为各行各业的新宠。然而不少宝子们们却发现了一个有趣的现象:虽然都是依赖AI生成文本,有些…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)(八continue语句和break语句)
在C中,continue语句和break语句都是用于控制循环的执行流程的关键字,但它们有不同的用途和行为。 1、break语句用于立即终止当前所在的循环或switch语句,并跳出循环体,继续执行循环之后的代码,break语句用于直接跳出循…...
sql server 动态执行sql
实例: execute sp_executesql Nselect count(1) FROM table X2 WITH(NOLOCK) WHERE X2.UPDDTTM > DT_START AND X2.UPDDTTM < DT_END , NDT_START datetime,DT_END datetime, DT_START2025-01-02 10:06:58.620,DT_END2025-01-02 10:09:35.457 参考&…...
【数据结构Ⅰ复习题】
如有错误欢迎指正,题目根据教材----------严蔚敏数据结构(c语言版 第2版)人民邮电电子版 数据结构Ⅰ复习题 一、填空题1.算法应该具备的5个重要特性有___有穷性___、确定性、可行性、输入和输出。2.非空单链表L中*p是头…...
经验证:将数据从索尼传输到Android的 4 种方法
概括 像Android Galaxy S20 这样的新型Android智能手机很酷,但除了将数据从索尼传输到Android之外。众所周知,旧的索尼手机上存储着大量的文件,因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题,我们做…...
服务器端请求伪造之基本介绍
一.服务器端请求伪造漏洞基础 1.客户端请求 客户端请求指的是由客户端设备(如个人计算机、智能手机、平板电脑等)或软件(浏览器、各种APP)发出的请求,以获取指定的网页、图片、视频或其他资源。比如当用户在浏览器中输…...
Java反射详解(三)
上一篇博客:Java反射详解(二) 写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.c…...
HTML——59. maxlength和disabled属性
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>maxlength和disabled属性</title></head><body><!--input元素的type属性:(必须要有)1.指定输入内容的类型2.默认为text,单行文本框--> …...
Java中的函数式接口详解(一)
1. 函数式接口 1.1. 定义 函数式接口(Function Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式接口又称为:功能接口。 功能接口为 Lambda 表达式和方法引用(用双冒号 ::来进行方法调用)提供…...
Quo Vadis, Anomaly Detection? LLMs and VLMs in the Spotlight 论文阅读
文章信息: 原文链接:https://arxiv.org/abs/2412.18298 Abstract 视频异常检测(VAD)通过整合大语言模型(LLMs)和视觉语言模型(VLMs)取得了显著进展,解决了动态开放世界…...
redis的学习(二)
4 哈希表 哈希类型中的映射关系通常称为field-value,⽤于区分Redis整体的键值对(key-value), 注意这⾥的value是指field对应的值,不是键(key)对应的值, 4.1 操作命令 hsetÿ…...
简单使用linux
1.1 Linux的组成 Linux 内核:内核是系统的核心,是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 文件系统 : 文件存放在磁盘等存储设备上的组织方法。 Linux 能支持多种目前浒的文件系统,如 ext4 、 FAT 、 VFAT 、 ISO9660 、 NF…...
springboot541党员学习交流平台(论文+源码)_kaic
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统党员学习交流平台信息管理难度大,容错率低&am…...
心力衰竭相关临床记录数据分析开发技术概述
心力衰竭相关临床记录数据分析开发技术概述 心力衰竭临床记录数据分析的开发涉及多种技术,包括数据采集、处理、建模和可视化等方面。以下是从技术角度对整个开发流程的概述: 数据采集技术 1.1 数据来源 公开数据集:如 UCI 数据存储库、Clin…...
SpringMVC(六)拦截器
目录 1.什么是拦截器 2.拦截器和过滤器有哪些区别 3.拦截器方法 4.单个拦截器的执行流程 5.使用拦截器实现用户登录权限验证(实例) 1.先在html目录下写一个login.html文件 2.在controller包下写一个LoginController文件 3.加拦截器 1.创建一个conf…...
将simpletex 识别的公式 复制到ppt 中
1)点击 复制MathML(word) 2)右击粘贴到任意word 中 3)将word公式粘到 office (2019) 的ppt 中 线上识别链接:SimpleTex - Snip & Get!...
vs 2022 中xml 粘贴为Class 中,序列化出来的xml 的使用
上图是visual studio 2022 中使用的粘贴功能的菜单位置 在生成的xml 中,有些是类似如下类型的 [System.Serializable] [System.Xml.Serialization.XmlType] public class Item {private bool isVisibleField;private bool isVisibleFieldSpecified;[System.Xml.Se…...
短视频平台的视频水印怎么去除?
当你看到某个短视频,觉得内容非常有价值,想要个人收藏以便日后学习或回顾,但发现短视频平台无法直接下载且带有水印时,以下提供的几种方法将帮助你轻松去除水印,获取高清无水印的视频内容。 方法一:使用第…...
《Vue3实战教程》34:Vue3状态管理
如果您有疑问,请观看视频教程《Vue3实战教程》 状态管理 什么是状态管理? 理论上来说,每一个 Vue 组件实例都已经在“管理”它自己的响应式状态了。我们以一个简单的计数器组件为例: vue <script setup> import { r…...
AI大模型系列之七:Transformer架构讲解
目录 Transformer网络是什么? 输入模块结构: 编码器模块结构: 解码器模块: 输出模块结构: Transformer 具体是如何工作的? Transformer核心思想是什么? Transformer的代码架构 自注意力机制是什么…...
每天五分钟机器学习:凸集
本文重点 在SVM中,目标函数是一个凸函数,约束集合是一个凸集。因此,SVM问题可以转化为一个凸规划问题来求解。这使得SVM在实际应用中具有较高的计算效率和准确性。 凸集的定义 凸集是指一个集合中的任意两点之间的线段都完全包含在这个集合中。换句话说,给定集合C中的两…...
【智能算法】改进蚁狮优化算法【matlab】
目录 1 主要内容 2 部分程序 3 程序结果 下载链接 1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型,即原始ALO算法的基础上添加了两种改进策略: - 改进1:将原先的间断性边界收缩因子变为连续性边界…...
【Python】闭包
闭包(Closure)是指一个函数记住了并可以访问它的词法作用域(lexical scope),即使这个函数在词法作用域之外执行。 闭包其实就是延伸了作用域的函数,包括被延伸函数主体中引用的非全局变量和局部变量。这些…...
Python跨年烟花
目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…...
QT------------其他工具软件和技术
实现思路 多语言界面程序设计: 使用 QTranslator 类为 QT 应用程序提供多语言支持。将不同语言的翻译文件(.qm 文件)添加到应用程序中,根据用户的语言设置动态加载相应的翻译文件。 QT 样式表(QSS)&#x…...
数据结构9.3 - 文件基础(C++)
目录 1 打开文件字符读写关闭文件 上图源自:https://blog.csdn.net/LG1259156776/article/details/47035583 1 打开文件 法 1法 2ofstream file(path);ofstream file;file.open(path); #include<bits/stdc.h> using namespace std;int main() {char path[]…...
javaEE-文件操作和IO-文件
目录 一.什么是文件 1.文件就是硬盘(磁盘)上的文件。 2.计算机中存储数据的设备: 3.硬盘的物理特征 4.树型结构组织和⽬录 5.文件路径 文件路径有两种表示方式: 6.文件的分类 二、java中文件系统的操作 1.File类中的属性: 2.构造方…...
富芮坤FR800X系列之软件开发工具链(如IDE、编译器、调试器等)
文章目录 一、IDE(集成开发环境)二、编译器三、调试器四、其他辅助工具五、小结 FR800x系列作为一款低功耗蓝牙芯片,其软件开发工具链对于开发者来说至关重要。以下是对FR800x软件开发工具链的详细介绍,包括IDE(集成开…...
微服务-Eureka
Eureka的作用 使用RestTemplate完成远程调用需要手动的生命被调用者的ip和端口,从而能够发起http请求,但是如果有很多个实例也更加不能有效的处理,而且我们又该如何知道这些实例是否健康呢。所以就有了很多的注册中心比如Eureka、Nacos等等。…...
Elasticsearch: 高级搜索
一、match_all匹配所有文档 1、介绍: match_all查询是一个特殊的查询类型,它用于匹配索引中的所有文档,而不考虑任何特定的查询条件。 基本语法: GET /<your-index-name>/_search {"query": {"match_all…...
项目优化之策略模式
目录 策略模式基本概念 策略模式的应用场景 实际项目中具体应用 项目背景: 策略模式解决方案: 计费模块策略模式简要代码 策略模式基本概念 策略模式(Strategy Pattern) 是一种行为型设计模式,把算法的使用放到环境类中,而算…...
HTML——57. type和name属性
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>type和name属性</title></head><body><!--1.input元素是最常用的表单控件--><!--2.input元素不仅可以在form标签内使用也可以在form标签外使用-…...
LabVIEW 实现自动对焦的开发
自动对焦(Autofocus, AF)技术是通过分析图像或传感器信号,动态调整焦点位置以实现清晰成像或高精度定位的过程。在LabVIEW中,可以通过集成信号采集、数据处理、控制算法和硬件接口模块,实现多种自动对焦方法࿰…...
Ruby 数据类型
Ruby 数据类型 Ruby,作为一种动态、开放源代码的编程语言,以其简洁明了的语法和强大的功能而闻名。在Ruby中,数据类型是编程的核心组成部分,它们决定了变量可以存储的信息种类以及可以对这些信息执行的操作。Ruby是一种类型安全的…...
【MySQL】--- 表的CRUD
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: MySQL CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)。 🏠 插入C 🧷 基本…...
算法13、基础二分查找的应用(木根切割等)
🌰1、方程求根 晴问算法 1️⃣即求f(x) x^3 x^2 x - a 0的根,又因为要求精确到0.01,所以eps至少设置为1e-3或者更小; 2️⃣求导得3x^2 2x 1 2x^2 x^2 2x 1 2x^2 (x1)^2 > 0, 所以f(x)是单调递增函数&…...
hive on spark报错解决(基于hive-3.1.3和spark-2.3.0)
相关配置可参考:https://blog.csdn.net/weixin_46389691/article/details/134126254 原作者:月亮给我抄代码 他写的很详细 ERROR : Job failed with java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init&…...
CentOS — 目录管理
文章目录 一、目录结构二、切换目录三、查看目录四、创建目录五、复制目录六、剪切目录七、删除目录 目录也是一种文件。 蓝色目录,绿色可执行文件,红色压缩文件,浅蓝色链接文件,灰色其它文件, 点开头的是隐藏文件&…...