Java中如何高效地合并多个对象的List数据:方法与案例解析!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在Java编程中,处理多个对象的集合是常见的需求。特别是在数据处理和集合操作中,我们经常需要将多个List合并成一个,以便进行进一步的数据分析或操作。这看似简单的任务实际上涉及到各种操作细节和潜在的优化策略。本文将详细探讨如何高效地合并多个List,提供具体的代码示例,并讨论不同的方法的优缺点,以帮助你更好地理解和应用这些技巧。

合并List的基本方法

1. 使用addAll方法

最基本的方法是利用List接口的addAll方法。这个方法将一个列表的所有元素添加到另一个列表中。以下是一个简单的示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

在这个例子中,我们首先创建了两个List对象,然后使用addAll将第二个列表的元素添加到第一个列表中。这样,我们就得到了一个包含所有元素的新列表。

代码解析:

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码展示了如何合并两个 List 集合。它创建了两个包含字符串的 ArrayList 对象,然后将第二个列表中的所有元素添加到第一个列表中,从而实现合并。

下面是对如上代码的详细解读:

  1. import java.util.ArrayList;:导入 ArrayList 类,它是 List 接口的一个实现,用于创建动态数组。

  2. import java.util.Arrays;:导入 Arrays 类,它包含操作数组的各种方法。

  3. import java.util.List;:导入 List 接口。

  4. public class ListMergeExample { ... }:定义了一个名为 ListMergeExample 的公共类。

  5. public static void main(String[] args) { ... }:定义了程序的主入口点 main 方法。

  6. List<String> list1 = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));:使用 Arrays.asList 方法创建一个包含三个字符串的列表,并将其传递给 ArrayList 的构造函数,创建 list1

  7. List<String> list2 = new ArrayList<>(Arrays.asList("Date", "Elderberry", "Fig"));:同样地,创建另一个包含三个字符串的列表 list2

  8. List<String> mergedList = new ArrayList<>(list1);:创建一个新的 ArrayList 对象 mergedList,它包含 list1 中的所有元素。

  9. mergedList.addAll(list2);:调用 mergedListaddAll 方法,将 list2 中的所有元素添加到 mergedList 中。

  10. System.out.println("Merged List: " + mergedList);:打印出合并后的列表 mergedList

总之,我这个示例展示了如何使用 ArrayList 的构造函数和 addAll 方法来合并两个列表。合并后的列表 mergedList 包含了 list1list2 中的所有元素。这种方法是合并两个列表的简单而有效的方式。

代码结果本地展示如下:

2. 使用Stream API进行合并

如果你使用的是Java 8或更高版本,可以利用Stream API来进行更简洁和函数式的合并操作。以下是一个示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class ListMergeStreamExample {public static void main(String[] args) {List<String> list1 = Arrays.asList("Apple", "Banana", "Cherry");List<String> list2 = Arrays.asList("Date", "Elderberry", "Fig");// 使用Stream API合并列表List<String> mergedList = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());System.out.println("Merged List: " + mergedList);}
}

这里,我们使用Stream.concat将两个流合并,再通过collect(Collectors.toList())将结果收集到一个新的列表中。这种方法不仅简洁,而且可以很方便地处理复杂的数据流操作。

代码解析:

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码展示了如何使用Java 8引入的Stream API来合并两个列表。Stream API提供了一种高级迭代方式,可以进行复杂的集合操作,如过滤、映射、归约等。

下面是这段代码的解释:

  1. import java.util.Arrays;:导入 Arrays 类,它包含操作数组的各种方法。

  2. import java.util.List;:导入 List 接口。

  3. import java.util.stream.Collectors;:导入 Collectors 类,它包含用于终止Stream操作的方法,如收集元素到集合中。

  4. import java.util.stream.Stream;:导入 Stream 接口,它表示能遍历元素的序列。

  5. public class ListMergeStreamExample { ... }:定义了一个名为 ListMergeStreamExample 的公共类。

  6. public static void main(String[] args) { ... }:定义了程序的主入口点 main 方法。

  7. List<String> list1 = Arrays.asList("Apple", "Banana", "Cherry");:使用 Arrays.asList 方法创建一个包含三个字符串的列表 list1

  8. List<String> list2 = Arrays.asList("Date", "Elderberry", "Fig");:同样地,创建另一个包含三个字符串的列表 list2

  9. List<String> mergedList = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());

    • list1.stream()list2.stream() 分别将 list1list2 转换为流。
    • Stream.concat(list1.stream(), list2.stream()) 使用 Stream.concat 方法将两个流连接起来,创建一个新的流,其中包含两个列表的所有元素。
    • .collect(Collectors.toList()) 使用 Collectors.toList() 方法将流中的元素收集到一个新的列表中。
  10. System.out.println("Merged List: " + mergedList);:打印出合并后的列表 mergedList

总之,我这个示例展示了如何使用Stream API来合并两个列表。通过将两个列表转换为流,然后使用 Stream.concat 方法连接它们,最后使用 collect 方法将结果收集到一个新的列表中。这种方法提供了一种函数式编程的方式来处理集合,使得代码更加简洁和表达性强。

代码结果本地展示如下:

3. 使用Collection工具类

Java的Collections工具类提供了多种静态方法来处理集合,但对于合并ListaddAll方法最为直接。虽然Collections工具类并没有直接提供合并多个列表的功能,但你可以使用它来完成其他集合操作,如排序、查找等。

性能考量

在处理大规模数据时,选择合适的合并方法尤为重要。以下是几种方法的性能分析:

  • addAll方法: 直接且高效,特别是在处理简单的合并操作时。它的时间复杂度为O(n),其中n是要添加的元素的数量。
  • Stream API: 适用于需要链式操作和函数式编程风格的场景。它的性能略低于addAll,因为流操作涉及到额外的开销。不过,它的可读性和灵活性较高。
  • 手动合并: 如果需要更复杂的合并逻辑,比如去重、过滤等,手动遍历和合并可能更灵活。但这通常需要更多的编码和测试。

高级操作与优化技巧

1. 线程安全的合并操作

在多线程环境下,合并List时需要考虑线程安全的问题。如果多个线程同时对同一个List进行操作,可能会导致数据不一致或程序崩溃。为确保线程安全,可以使用Collections.synchronizedList方法或CopyOnWriteArrayList

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;public class ThreadSafeListMerge {public static void main(String[] args) {List<String> list1 = Collections.synchronizedList(new ArrayList<>(Arrays.asList("Apple", "Banana")));List<String> list2 = Collections.synchronizedList(new ArrayList<>(Arrays.asList("Cherry", "Date")));List<String> mergedList = new CopyOnWriteArrayList<>(list1);mergedList.addAll(list2);System.out.println("Thread-safe Merged List: " + mergedList);}
}

CopyOnWriteArrayList在写操作时会复制底层数组,这使得读操作不会受到影响,适用于读多写少的场景。

代码解析:

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码展示了如何合并两个线程安全的列表,并创建一个新的线程安全的合并列表。代码使用了 Collections.synchronizedList 方法来创建线程安全的列表,并使用 CopyOnWriteArrayList 类来实现合并操作。

下面是这段代码的详细解释:

  1. import java.util.*;:导入了Java util包下的所有类和接口。

  2. import java.util.concurrent.CopyOnWriteArrayList;:导入了 CopyOnWriteArrayList 类,它是线程安全的变体之一,适用于读多写少的场景。

  3. public class ThreadSafeListMerge { ... }:定义了一个名为 ThreadSafeListMerge 的公共类。

  4. public static void main(String[] args) { ... }:定义了程序的主入口点 main 方法。

  5. List<String> list1 = Collections.synchronizedList(new ArrayList<>(Arrays.asList("Apple", "Banana")));:使用 Collections.synchronizedList 方法包装一个新的 ArrayList,使其线程安全,并初始化为包含 “Apple” 和 “Banana”。

  6. List<String> list2 = Collections.synchronizedList(new ArrayList<>(Arrays.asList("Cherry", "Date")));:同样地,创建另一个线程安全的列表 list2,并初始化为包含 “Cherry” 和 “Date”。

  7. List<String> mergedList = new CopyOnWriteArrayList<>(list1);:创建一个 CopyOnWriteArrayList,并通过构造函数传入 list1 来初始化。

  8. mergedList.addAll(list2);:调用 CopyOnWriteArrayListaddAll 方法,将 list2 中的所有元素添加到 mergedList 中。

  9. System.out.println("Thread-safe Merged List: " + mergedList);:打印出线程安全的合并列表 mergedList

总之,我这个示例展示了如何使用 Collections.synchronizedList 来创建线程安全的列表,并使用 CopyOnWriteArrayList 来合并这些列表。CopyOnWriteArrayList 在每次修改(添加、删除等)时都会复制整个底层数组,因此读操作不需要加锁,适用于读多写少的场景。这种方法确保了在多线程环境下对列表的并发访问是安全的。

代码结果本地展示如下:

2. 性能优化:避免不必要的复制

在合并List时,尽量避免不必要的复制操作。使用addAllStream.concat方法时,注意数据的实际使用场景。例如,创建一个初始容量较大的ArrayList可以减少重新调整容量的开销:

import java.util.*;
import java.util.stream.Collectors;public class OptimizedListMerge {public static void main(String[] args) {List<String> list1 = Arrays.asList("Apple", "Banana", "Cherry");List<String> list2 = Arrays.asList("Date", "Elderberry", "Fig");// 提前指定合并后的初始容量List<String> mergedList = new ArrayList<>(list1.size() + list2.size());mergedList.addAll(list1);mergedList.addAll(list2);System.out.println("Optimized Merged List: " + mergedList);}
}

代码解析:

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码展示了如何优化列表合并操作,通过提前指定合并后的列表的初始容量,可以减少在添加元素时列表内部数组的扩容操作,从而提高性能。

下面是这段代码的详细解释:

  1. import java.util.*;:导入了Java util包下的所有类和接口。

  2. import java.util.stream.Collectors;:导入了 Collectors 类,虽然在这个示例中没有直接使用,但它通常用于与Stream API一起操作。

  3. public class OptimizedListMerge { ... }:定义了一个名为 OptimizedListMerge 的公共类。

  4. public static void main(String[] args) { ... }:定义了程序的主入口点 main 方法。

  5. List<String> list1 = Arrays.asList("Apple", "Banana", "Cherry");:使用 Arrays.asList 方法创建一个包含三个字符串的列表 list1

  6. List<String> list2 = Arrays.asList("Date", "Elderberry", "Fig");:同样地,创建另一个包含三个字符串的列表 list2

  7. List<String> mergedList = new ArrayList<>(list1.size() + list2.size());:创建一个新的 ArrayList,初始容量设置为 list1list2 的大小之和。这样可以确保在添加元素时不会发生内部数组的扩容操作。

  8. mergedList.addAll(list1);:调用 addAll 方法将 list1 中的所有元素添加到 mergedList 中。

  9. mergedList.addAll(list2);:调用 addAll 方法将 list2 中的所有元素添加到 mergedList 中。

  10. System.out.println("Optimized Merged List: " + mergedList);:打印出优化合并后的列表 mergedList

总之,我这个示例展示了如何通过提前指定合并后的列表的初始容量来优化列表合并操作。这样做可以避免在添加元素时列表内部数组的多次扩容,从而提高性能。这是一种常见的优化技巧,特别是在处理大数据量时。

代码结果本地展示如下:

3. 自定义合并策略

有时,合并List时可能需要遵循特定的业务逻辑。例如,按照某种规则合并重复的对象,可以通过自定义合并策略实现:

package com.demo.javase.test;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class CustomMergeStrategy {public static void main(String[] args) {List<Person> list1 = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));List<Person> list2 = Arrays.asList(new Person("Alice", 30), new Person("Charlie", 35));// 自定义合并策略:去重并按年龄排序List<Person> mergedList = Stream.concat(list1.stream(), list2.stream()).distinct()   // 去重.sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.toList());System.out.println("Custom Merged List: " + mergedList);}static class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return name + " (" + age + ")";}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}}
}

代码解析:

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码定义了一个名为 CustomMergeStrategy 的类,它展示了如何使用Java 8的Stream API来合并两个自定义对象列表,并应用自定义的合并策略,包括去重和按年龄排序。

下面是这段代码的中文解释:

  1. package com.demo.javase.test;:定义了代码的包名为 com.demo.javase.test

  2. import java.util.*;:导入了Java util包下的所有类和接口。

  3. import java.util.stream.Collectors;:导入了 Collectors 类,用于将流收集到各种数据结构中。

  4. import java.util.stream.Stream;:导入了 Stream 接口,用于进行流操作。

  5. public class CustomMergeStrategy { ... }:定义了一个名为 CustomMergeStrategy 的公共类。

  6. public static void main(String[] args) { ... }:定义了程序的主入口点 main 方法。

  7. List<Person> list1 = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));:创建了一个包含两个 Person 对象的列表 list1

  8. List<Person> list2 = Arrays.asList(new Person("Alice", 30), new Person("Charlie", 35));:创建了另一个包含两个 Person 对象的列表 list2

  9. List<Person> mergedList = Stream.concat(list1.stream(), list2.stream())

    • 使用 Stream.concat 方法将 list1list2 的流连接起来。
  10. .distinct():使用 distinct 方法去除流中的重复元素。这要求 Person 类正确重写了 equalshashCode 方法。

  11. .sorted(Comparator.comparingInt(Person::getAge)):使用 sorted 方法按 Person 对象的年龄进行排序。

  12. .collect(Collectors.toList()):使用 collect 方法将流中的元素收集到一个新的列表中。

  13. System.out.println("Custom Merged List: " + mergedList);:打印出合并后的列表 mergedList

  14. static class Person { ... }:定义了一个嵌套的静态类 Person,它包含 nameage 属性,以及相应的构造函数、getter方法、toString 方法、equals 方法和 hashCode 方法。

总之,我这个示例展示了如何使用Stream API来合并两个自定义对象的列表,并应用去重和排序的自定义合并策略。通过重写 equalshashCode 方法,Person 类的对象可以在流操作中被正确地识别为相等,从而实现去重。然后,使用 sorted 方法按年龄对去重后的流进行排序,最后收集到一个新的列表中。

代码结果本地展示如下:

高级数据结构与算法

1. 合并排序数据

在处理已经排序的List时,可以使用合并算法进行高效合并。类似于归并排序中的合并过程:

import java.util.*;public class MergeSortedLists {public static void main(String[] args) {List<Integer> list1 = Arrays.asList(1, 3, 5, 7);List<Integer> list2 = Arrays.asList(2, 4, 6, 8);List<Integer> mergedList = mergeSortedLists(list1, list2);System.out.println("Merged Sorted List: " + mergedList);}public static List<Integer> mergeSortedLists(List<Integer> list1, List<Integer> list2) {List<Integer> mergedList = new ArrayList<>();int i = 0, j = 0;while (i < list1.size() && j < list2.size()) {if (list1.get(i) <= list2.get(j)) {mergedList.add(list1.get(i++));} else {mergedList.add(list2.get(j++));}}while (i < list1.size()) {mergedList.add(list1.get(i++));}while (j < list2.size()) {mergedList.add(list2.get(j++));}return mergedList;}
}

代码解析:

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

这段Java代码定义了一个名为 MergeSortedLists 的类,其中包含一个 main 方法和一个用于合并两个已排序列表的静态方法 mergeSortedLists

下面是这段代码的详细解释:

  1. public class MergeSortedLists { ... }:定义了一个名为 MergeSortedLists 的公共类。

  2. public static void main(String[] args) { ... }:定义了程序的主入口点 main 方法。

  3. List<Integer> list1 = Arrays.asList(1, 3, 5, 7);:使用 Arrays.asList 方法创建一个包含四个整数的列表 list1

  4. List<Integer> list2 = Arrays.asList(2, 4, 6, 8);:同样地,创建另一个包含四个整数的列表 list2

  5. List<Integer> mergedList = mergeSortedLists(list1, list2);:调用 mergeSortedLists 方法,传入 list1list2 作为参数,并将返回的合并后的列表赋值给 mergedList

  6. System.out.println("Merged Sorted List: " + mergedList);:打印出合并后的已排序列表 mergedList

  7. public static List<Integer> mergeSortedLists(List<Integer> list1, List<Integer> list2) { ... }:定义了一个静态方法 mergeSortedLists,它接受两个 List<Integer> 类型的参数,并返回一个合并后的已排序列表。

  8. List<Integer> mergedList = new ArrayList<>();:在方法内部,创建一个新的 ArrayList 用于存储合并后的列表。

  9. int i = 0, j = 0;:初始化两个索引变量 ij,用于分别遍历 list1list2

  10. while (i < list1.size() && j < list2.size()) { ... }:使用一个循环,当 i 小于 list1 的大小且 j 小于 list2 的大小时,比较两个列表当前索引的元素。

  11. if (list1.get(i) <= list2.get(j)) { ... } else { ... }:如果 list1 中的当前元素小于或等于 list2 中的当前元素,则将其添加到 mergedList 中,并递增 i;否则,将 list2 中的当前元素添加到 mergedList 中,并递增 j

  12. while (i < list1.size()) { ... }:如果 list1 中还有剩余元素,将它们添加到 mergedList 中。

  13. while (j < list2.size()) { ... }:如果 list2 中还有剩余元素,将它们添加到 mergedList 中。

  14. return mergedList;:返回合并后的已排序列表。

总之,我这个示例展示了如何合并两个已排序的列表,并确保合并后的列表也是有序的。通过逐个比较两个列表中的元素,并将较小的元素先添加到合并列表中,直到一个列表的所有元素都被添加完毕,然后添加另一个列表的剩余元素。这种方法保证了合并后的列表保持有序。

代码结果本地展示如下:

2. 分布式数据合并

在分布式系统中,合并操作可能涉及到跨网络的数据传输。可以使用框架如Apache Spark、Apache Flink等来处理大规模数据的合并操作。这些框架提供了高效的分布式计算和数据处理能力。

实际应用场景

1. 数据库应用

在处理数据库操作时,可能需要将查询结果合并。可以使用SQL的UNION操作符来实现:

SELECT * FROM table1
UNION
SELECT * FROM table2;

2. 数据流处理

在数据流处理中,合并操作是常见的需求。例如,在ETL(Extract, Transform, Load)过程中,可能需要合并来自不同源的数据。

3. 用户数据管理

在用户数据管理系统中,可能需要合并用户信息,比如合并来自不同系统的用户数据,去重并统一格式。

总结

合并多个List的操作在Java编程中是非常基础但却至关重要的。本文介绍了多种合并方法,并从性能优化、线程安全、自定义策略等角度进行了深入探讨。理解这些技术可以帮助你在处理复杂数据场景时做出更优的选择,提升代码的效率和可维护性。无论是简单的列表合并还是复杂的数据处理,掌握合并技巧都是成为高效Java开发者的重要一步。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17181.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候&#xff0c;其实我们重点还是学习的是他们的正向怎么传播&#xff0c;以及反向怎么传递的。 如下图所示&#xff1a; 第一&#xff1a;relu函数的正向传播函数是&#xff1a;当输入值&#xff08;隐藏层&#xff09;值大于了&#xff0c;就输出…

React源码揭秘 | scheduler 并发更新原理

React 18增加了并发更新特性&#xff0c;开发者可以通过useTransition等hooks延迟执行优先级较低的更新任务&#xff0c;以达到页面平滑切换&#xff0c;不阻塞用户时间的目的。其实现正是依靠scheduler库。 scheduler是一个依赖时间片分片的任务调度器&#xff0c;React团队将…

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件&#xff0c;关节不仅需要通过机械设计实现复杂的运动能力&#xff0c;还必须通过电子组件和控制系统来精确控制这些运动。…

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…

软件项目估算偏差的5 大源头及解决方案

软件项目成本估算偏差往往导致资金紧张&#xff0c;资源投入受限&#xff0c;进度延误无法按时交付&#xff0c;为控制成本还可能牺牲质量&#xff0c;引发团队士气低落、客户不满&#xff0c;严重时项目直接失败 。 因此&#xff0c;及时解决或降低项目偏差就非常重要&#xf…

树莓派学习

树莓派4B 基础操作 开机 开机要主要先接好线再通电 关机 先在系统里面关机再断电 可以在界面里面点击关机&#xff0c;或者使用命令行 使用网线连接到树莓派 用笔记本的以太网口接线到树莓派 在网络连接里面打开WLAN的网络共享&#xff0c;共享选择以太网口 在cmd里面输…

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description&#xff1a;任务描述 勾选 Discard old builds Discard old builds&#xff1a;控制何时…

一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记

时间轴呈现事故进程 17:00&#xff1a;开发人员小李正在尝试利用 Python 爬虫从企查查&#xff08;https://www.qcc.com&#xff09;抓取公司工商信息。原本一切正常&#xff0c;但突然发现信息采集失败&#xff0c;程序抛出大量选择器错误。17:15&#xff1a;小李发现&#x…

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 &#xff08;所搭环境如上图所示&#xff09; A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址&#xff0c;再进入环回接口配置IP地址) &#xff08;配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址&#xff09; &#xff08;置R3路由器的0/0/0接…

Java练习(20)

ps:练习来自力扣 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 class Solution {pu…

在ArcGIS JS API中使用WebGL实现波纹扩散特效

在现代WebGIS开发中&#xff0c;ArcGIS JS API 是一个非常强大的工具&#xff0c;它允许开发者创建丰富的地理信息应用。结合WebGL技术&#xff0c;我们可以实现更加复杂和炫酷的可视化效果。本文将介绍如何使用ArcGIS JS API结合WebGL实现一个波纹扩散特效。 波纹扩散效果 1 概…

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…

支持向量机原理

支持向量机&#xff08;简称SVM&#xff09;虽然诞生只有短短的二十多年&#xff0c;但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法&#xff0c;不考虑特定的训练数据集&#xff0c;尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源&#xff0c;恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…

消息中间件:RabbitMQ镜像集群部署配置全流程

目录 1、特点 2、RabbitMQ的消息传递模式 2.1、简单模式&#xff08;Simple Mode&#xff09; 2.2、工作队列模式&#xff08;Work Queue Mode&#xff09; 2.3、发布/订阅模式&#xff08;Publish/Subscribe Mode&#xff09; 2.4、路由模式&#xff08;Routing Mode&am…

财务主题数据分析-企业盈利能力分析

企业盈利能力数据主要体现在财务三张表中的利润表里面&#xff0c;盈利能力需要重点需要关注的指标有&#xff1a;毛利率、净利率、净利润增长率、营业成本增长率等&#xff1b; 接下来我们分析一下某上市公司披露的财务数据&#xff0c;看看该企业盈利能力如何&#xff1a; …

图数据库neo4j进阶(一):csv文件导入节点及关系

CSV 一、load csv二、neo4j-admin import<一>、导入入口<二>、文件准备<三>、命令详解 一、load csv 在neo4j Browser中使用Cypher语句LOAD CSV,对于数据量比较大的情况,建议先运行create constraint语句来生成约束 create constraint for (s:Student) req…

npm包管理工具

包管理工具 npm 包管理工具 介绍 Node Package Manager&#xff1a;也就是Node包管理工具但是目前已经不仅仅是Node包管理器&#xff0c;在前端项目中我们也使用它来管理依赖的包比如 vue、vue-router、vuex、express、koa 下载和安装 npm属于Node的管理工具&#xff0c;安…

MyBatis映射文件 <resultMap> 元素详解与示例

引言 <resultMap> 是 MyBatis 中最核心的映射配置元素&#xff0c;用于解决数据库字段与 Java 对象属性之间的复杂映射问题&#xff0c;尤其是字段名不一致、嵌套对象关联、集合映射等场景。ResultMap 的设计思想是&#xff0c;对简单的语句做到零配置&#xff0c;对于复…

时间盲注Boolen盲注之获取表、列、具体数据的函数

时间盲注 时间盲注&#xff08;Time-Based Blind SQL Injection&#xff09;是一种利用数据库响应时间的差异来推断数据的SQL注入技术。它的核心原理是通过构造特定的SQL查询&#xff0c;使得数据库在执行查询时产生时间延迟&#xff0c;从而根据延迟的有无来推断数据。 时间…