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;
        }

        @Override
        public String toString() {
            return name + " (" + age + ")";
        }

        @Override
        public 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);
        }

        @Override
        public 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 !!!


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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR

未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …

sqlilabs--小实验

一、先盲注判断 ?id1 and sleep(2)-- 如果发现页面存在注点&#xff0c;使用时间盲注脚本进行注入 import requestsdef inject_database(url):name for i in range(1, 20): # 假设数据库名称长度不超过20low 48 # 0high 122 # zmiddle (low high) // 2while low &l…

QT 异步编程之多线程

一、概述 1、在进行桌面应用程序开发的时候&#xff0c;假设应用程序在某些情况下需要处理比较复制的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事…

编码格式大全解释以及相关编码特性

目录 说明: 1. Base64 Base64编码的字符集通常包括&#xff1a; Base64的工作原理&#xff1a; Base64编码在安全渗透中的应用场景 常见的Base64编码绕过场景 如何防范Base64绕过攻击 2. URL编码&#xff08;Percent Encoding&#xff09; URL编码与安全渗透的关系 示…

软件工程-模块化设计

分解&#xff08;decomposition&#xff09; C&#xff08;P1P2&#xff09;> C&#xff08;P1&#xff09;C&#xff08;P2&#xff09; E&#xff08;P1P2&#xff09;> E&#xff08;P1&#xff09;E&#xff08;P2&#xff09; C为问题的复杂程度&#xff0c;E为解…

LabVIEW显微镜成像偏差校准

在高精度显微镜成像中&#xff0c;用户常常需要通过点击图像的不同位置&#xff0c;让电机驱动探针移动到指定点进行观察。然而&#xff0c;在实际操作中&#xff0c;经常会遇到一个问题&#xff1a;当点击位于图像中心附近的点时&#xff0c;探针能够相对准确地定位&#xff1…

【AI实践】deepseek支持升级git

当前Windows 11 WSL的git是2.17&#xff0c;Android Studio提示需要升级到2.19版本 网上找到指导文章 安装git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…

在Windows 7操作系统,基于llama.cpp本地化部署 deepseek-r1模型的方法 2025-02-08

一、概述 现在已经是大模型时代。 个人认为&#xff0c;deepseek效果惊艳&#xff0c;大模型已进入实用阶段。 有些电脑&#xff0c;由于种种原因&#xff0c;还在用 Windows 7&#xff0c; Windows XP 等操作系统。 为了让这些电脑用上大模型&#xff0c;本教程在 llama.c…

消息中间件: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…

【MySQL — 数据库基础】深入解析 MySQL 的联合查询

1. 插入查询结果 语法 insert into table_name1 select* from table_name2 where restrictions ;注意&#xff1a;查询的结果集合&#xff0c;列数 / 类型 / 顺序 要和 insert into 后面的表相匹配&#xff1b;列的名字不要求相同&#xff1b; create table student1(id int , …

算法学习笔记之数学基础

例1&#xff08;最小公倍数与最大公约数&#xff09; 计算最小公倍数 公式&#xff1a; LCM(A,B) A*B/GCD(A,B) A与B的最小公倍数等于A*B除以A与B的最大公约数 计算最大公约数&#xff1a;辗转相除法 原理&#xff1a;设A与B的最大公约数为x&#xff0c;则A是x的倍数&am…

通过操作系统中的IO模型理解Java中的BIO,NIO,AIO

操作系统中的三种IO模型 阻塞I/O 先来看看阻塞 I/O&#xff0c;当用户程序执行 read&#xff0c;线程会被阻塞 一直等到内核数据准备好&#xff0c;并把数据从内核缓冲区拷贝到应用程序的缓冲区中&#xff0c;当拷贝过程完成&#xff0c;read 才会返回 注意&#xff1a;阻塞…

多项式插值(数值计算方法)Matlab实现

多项式插值&#xff08;数值计算方法&#xff09;Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍 关于插值的定义及基本原理可以参照如下索引 插值原理&#xff08;数值计算方法&#xff…

SpringMVC请求执行流程源码解析

文章目录 0.SpringMVC九大内置组件1.processRequest方法1.请求先到service方法2.然后不管是get还是post都会跳转到processRequest方法统一处理 2.doService方法3.doDispatch方法1.代码2.checkMultipart 4.核心流程 0.SpringMVC九大内置组件 1.processRequest方法 1.请求先到se…

在vivado中对数据进行延时,时序对齐问题上的理清

在verilog的ISP处理流程中&#xff0c;在完成第一个模块的过程中&#xff0c;我经常感到困惑&#xff0c;到底是延时了多少个时钟&#xff1f;今日对这几个进行分类理解。 目录 1.输入信号激励源描述 1.1将数据延时[9]个clk 1.2将vtdc与hzdc延时[9]个clk(等价于单bit的数据…

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南&#xff1a;JavaGuide &#xff08;Github 收获148k Star&#xff09;。这是我在大三开始准备秋招面试的时候创建的&#xff0c;目前已经持续维护 6 年多了&#xff0c;累计提交了 5600 commit &#xff0c;共有 550 多位贡献者共同参与…

蓝桥杯-洛谷刷题-day5(C++)(为未完成)

1.P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 i.题目 ii.代码 #include <iostream> #include <string> using namespace std;int N, Na, Nb; //0-"剪刀", 1-"石头", 2-"布", 3-"蜥", 4-"斯"&#xff1…

MySQL - 索引 - 介绍

索引(Index)是帮助数据库高效获取数据的数据结构. 结构 语法 创建索引 creat [unique] index 索引名 on 表名 (字段名, ...); //创建唯一索引时加上unique, 多个字段用逗号隔开 查看索引 show index from 表名; 删除索引 drop index 索引名 on 表名;

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现&#xff1a; 一、背景   UWB&#xff08;Ultra-Wideband&#xff09;技术也被称之为“超宽带”&#xff0c;又称之为脉冲无线电技术。这是一种无需任何载波&#xff0c;通过发送纳秒…

安装WPS后,导致python调用Excel.Application异常,解决办法

在使用xlwings编辑excel文件时&#xff0c;默认调用的是“Excel.Application”&#xff0c;如果安装过wps&#xff0c;会导致该注册表为WPS&#xff0c;会导致xlwings执行异常 因为安装过WPS&#xff0c;导致与Excel不兼容的问题&#xff0c;想必大家都听说过。有些问题及时删…