【JAVA-Day49】Java LinkedList集合详解

news2024/10/5 13:43:31

Java LinkedList集合详解

  • 摘要
  • 引言
    • Java LinkedList集合详解
      • 一、什么是LinkedList集合
        • 1.1 链表数据结构
        • 1.2 双向链表
        • 1.3 动态大小
        • 1.4 插入和删除元素
        • 1.5 适用场景
      • 二、LinkedList集合的使用
        • 2.1 创建 LinkedList 集合、添加元素、遍历元素
        • 2.2 在指定位置插入元素
        • 2.3 获取指定位置的元素
        • 2.4 删除指定位置的元素
        • 2.5 在开头或末尾插入元素
      • 三、LinkedList集合的应用场景
        • 3.1 实现队列
        • 3.2 实现栈
        • 3.3 实现双端队列
        • 3.4 处理实时数据流
        • 3.5 实现其他数据结构
      • 四、LinkedList面试题
      • 五、Java LinkedList与ArrayList对比
        • 5.1 Java集合类LinkedList和ArrayList的对比分析
        • 5.2 链表与顺序表:它们在Java中有何不同?
        • 5.3 选择Java LinkedList还是ArrayList:优劣对比
      • 六、性能优化和最佳实践
        • 6.1 Java LinkedList的性能优化技巧
        • 6.2 链表与顺序表的优势与劣势:Java中如何选择?
      • 七、Java LinkedList的内部实现和工作原理
      • 八、高级应用和性能比较
      • 8.1 使用 LinkedList 构建高效数据结构:详细指南
        • 8.1.1 插入和删除操作
        • 8.1.2 迭代器遍历
        • 8.1.3 自定义节点
        • 8.1.4 注意内存占用
        • 8.1.5 避免随机访问
      • 8.2 Java 集合类 LinkedList 和 ArrayList 的性能比较
        • 8.2.1 插入和删除操作
        • 8.2.2 随机访问
        • 8.2.3 空间占用
        • 8.2.4 遍历性能
        • 8.2.5 选择建议
      • 九、LinkedList的使用案例
        • 9.1 场景描述
        • 9.2 使用LinkedList的任务管理器
        • 9.3 案例解释
      • 十、总结

在这里插入图片描述
在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


在这里插入图片描述

摘要

欢迎来到我的技术博客,本篇文章将深入探讨Java中的LinkedList集合。我们将首先介绍LinkedList的基本概念和结构,然后逐一讨论其用法、应用场景以及性能比较。通过本文,您将全面了解Java中LinkedList的内部实现和工作原理,以及如何优化其性能。最后,我们将回顾所学内容并提供实际应用案例,帮助您成为Java LinkedList的高级用户。

引言

在Java编程中,数据结构的选择对于程序性能和效率至关重要。其中,LinkedList是一种常见的数据结构,但与ArrayList等其他集合类相比,它有着独特的特点。本文将带您深入了解Java LinkedList,探讨其内部实现、使用方式以及性能方面的考虑,以便您在实际项目中作出明智的选择。

Java LinkedList集合详解

一、什么是LinkedList集合

LinkedList是一种双向链表实现的集合,它以节点相互连接的方式存储数据,具有动态大小和高度灵活的特性。这使得LinkedList适合在特定场景下使用,尤其在插入和删除元素频繁的情况下。


LinkedList是一种双向链表实现的集合,它以节点相互连接的方式存储数据,具有动态大小和高度灵活的特性。这使得LinkedList适合在特定场景下使用,尤其在插入和删除元素频繁的情况下。在这一部分,我们将更深入地探讨LinkedList的结构和工作原理。

1.1 链表数据结构

LinkedList基于链表数据结构,每个元素(节点)都包含数据和指向前一个节点和后一个节点的引用。这种结构使得在链表中插入和删除元素的开销相对较低,因为只需要调整相邻节点的引用,而不必像数组那样移动大量元素。

1.2 双向链表

LinkedList是双向链表,这意味着每个节点都有一个指向前一个节点和一个指向后一个节点的引用。这使得在双向链表中可以双向遍历,从而更容易实现某些操作。

1.3 动态大小

与数组不同,LinkedList的大小可以动态增长或缩小。当需要添加或移除元素时,它可以根据需要自动调整大小,而无需预先分配固定大小的内存。

1.4 插入和删除元素

由于LinkedList的特性,它在插入和删除元素方面非常高效。当插入元素时,只需更改相邻节点的引用,而不需要移动整个集合。同样,删除元素也只需要更新相邻节点的引用,而不必移动其他元素。

1.5 适用场景

LinkedList在以下情况下特别适用:

  • 需要频繁插入和删除元素,而不关心随机访问。
  • 需要实现队列、栈或双端队列等数据结构。
  • 处理实时数据流,其中数据的插入和删除频率较高。

LinkedList的这些特性使它在特定应用中非常有价值。在接下来的部分中,我们将深入研究如何使用LinkedList以及在何种情境下选择它。

二、LinkedList集合的使用

2.1 创建 LinkedList 集合、添加元素、遍历元素

首先,让我们演示如何创建一个LinkedList集合、向其中添加元素,并遍历集合中的元素:

LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Java");
linkedList.add("is");
linkedList.add("awesome");

for (String element : linkedList) {
    System.out.println(element);
}

这段代码展示了如何创建一个LinkedList集合,并使用add方法将字符串元素添加到集合中。随后,我们使用增强for循环遍历集合中的元素并将它们打印出来。

2.2 在指定位置插入元素

如果您需要在特定位置插入元素,可以使用add(index, element)方法。下面是一个示例:

linkedList.add(1, "programming");

这将在LinkedList的索引1处插入字符串"programming"。这是LinkedList的一个有用功能,尤其在需要在特定位置插入元素时非常实用。

2.3 获取指定位置的元素

如果您需要获取特定位置的元素,可以使用get(index)方法。以下是一个示例:

String secondElement = linkedList.get(1);

这将获取LinkedList中索引1处的元素,并将其存储在secondElement变量中。

2.4 删除指定位置的元素

要删除特定位置的元素,可以使用remove(index)方法。例如:

linkedList.remove(2); // 删除第三个元素

这会从LinkedList中删除索引2处的元素,实现了高效的元素删除操作。

2.5 在开头或末尾插入元素

如果您需要在LinkedList的开头或末尾插入元素,可以使用addFirst(element)addLast(element)方法。这是一种高效的方式,例如:

linkedList.addFirst("Hello");
linkedList.addLast("World");

这些方法允许您轻松地在LinkedList的开头或末尾添加新元素,而不必进行复杂的元素移动操作。

通过这些示例,您可以更好地了解如何使用LinkedList集合的各种功能,包括添加、遍历、插入和删除元素。 LinkedList的灵活性和性能使其在特定场景下成为一种强大的数据结构选择。接下来,我们将继续探讨LinkedList的应用场景和性能比较。

三、LinkedList集合的应用场景

LinkedList在实际编程中有多种应用场景,包括实现队列、栈、双端队列等数据结构。由于其高效的插入和删除操作,它在特定情境下非常有用,例如处理实时数据流。


3.1 实现队列

队列是一种数据结构,遵循"先进先出"(FIFO)的原则。LinkedList可以用作队列的底层数据结构,因为它允许高效地在队列的末尾添加元素(入队)和在队列的开头移除元素(出队)。这使得LinkedList成为实现队列的一种优秀选择。

3.2 实现栈

栈是一种数据结构,遵循"后进先出"(LIFO)的原则。LinkedList同样可以用作栈的底层数据结构。在栈中,元素的插入和删除操作都发生在同一端(栈顶),而LinkedList能够高效地执行这些操作,使其成为实现栈的良好选择。

3.3 实现双端队列

双端队列(Deque,即"double-ended queue")是一种数据结构,允许在队列的两端进行插入和删除操作。LinkedList提供了在双端队列中高效执行这些操作的能力,使其成为实现双端队列的有力工具。

3.4 处理实时数据流

在实时数据流处理中,数据的插入和删除频率非常高,因此需要一种能够高效处理这种情况的数据结构。LinkedList的能力在此方面非常突出,因为它可以在特定位置高效地插入和删除元素,而不会导致过多的性能开销。

3.5 实现其他数据结构

除了上述应用场景,LinkedList还可以用于实现其他数据结构,如优先队列、链接表等。其灵活性和高效的插入和删除操作使其适用于各种数据结构的构建。

总之,LinkedList在实际编程中有多种应用场景,尤其适用于需要高效地进行元素插入和删除操作的情况。通过了解这些应用场景,您可以更好地选择适当的数据结构来解决特定的编程问题。在接下来的部分,我们将探讨LinkedList的性能比较以及如何优化其性能。

四、LinkedList面试题

挑战自己的LinkedList知识,检验您是否已经掌握了LinkedList的关键概念和用法。以下是一个问题示例:

问题: LinkedList和ArrayList有什么区别,何时选择使用它们?

LinkedList和ArrayList的区别:

  1. 数据结构:LinkedList基于双向链表实现,而ArrayList基于动态数组实现。这是它们最显著的区别。
  2. 随机访问:ArrayList支持常数时间(O(1))的随机访问,因为它可以通过索引迅速访问元素。相比之下,LinkedList的随机访问时间较长(O(n)),因为需要从头或尾部开始遍历链表以达到目标位置。
  3. 插入和删除:LinkedList在插入和删除元素方面更加高效,因为它只需要调整相邻节点的引用。ArrayList在中间插入或删除元素时需要移动其他元素,因此性能可能较差。
  4. 内存占用:LinkedList通常需要更多的内存空间来存储额外的指针。相比之下,ArrayList通常具有更低的内存占用。

何时选择使用它们:

  • 使用ArrayList
    • 当需要频繁随机访问元素或迭代集合中的元素时,ArrayList通常更为合适,因为它的性能更好。
    • 当内存使用需求较低或不涉及大规模插入和删除操作时,ArrayList也是一个不错的选择。
  • 使用LinkedList
    • 当需要频繁插入和删除元素,而不关心随机访问时,LinkedList可能更合适,因为它在这些操作上性能更出色。
    • 当实现队列、栈、双端队列等数据结构时,LinkedList通常是更好的选择,因为它的插入和删除操作非常高效。
    • 在处理实时数据流或需要在中间插入/删除元素的情况下,LinkedList可能更适合,因为它不需要元素的移动操作。

总之,选择ArrayList还是LinkedList取决于您的具体需求。了解它们的区别以及在何时使用它们可以帮助您做出明智的数据结构选择。这也反映了在编程中选择合适的数据结构是一项重要的决策,需要根据特定情况来权衡性能和功能。

五、Java LinkedList与ArrayList对比

5.1 Java集合类LinkedList和ArrayList的对比分析

LinkedListArrayList是Java中两种不同类型的集合,它们在数据结构和性能方面存在显著差异。

  • 数据结构:LinkedList是基于双向链表实现的,每个元素都包含指向前一个和后一个元素的引用。ArrayList基于动态数组实现,它在内存中分配一块连续的空间来存储元素。
  • 随机访问:ArrayList支持常数时间(O(1))的随机访问,因为可以通过索引直接访问元素。LinkedList的随机访问时间相对较长(O(n)),因为需要从头部或尾部开始遍历链表以达到目标位置。
  • 插入和删除:LinkedList在插入和删除元素方面更高效,因为只需要调整相邻节点的引用。ArrayList在中间插入或删除元素时需要移动其他元素,因此性能可能较差。
  • 内存占用:LinkedList通常需要更多的内存空间来存储额外的指针,而ArrayList通常具有较低的内存占用。
5.2 链表与顺序表:它们在Java中有何不同?
  • 链表(LinkedList):链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的引用。链表支持高效的插入和删除操作,特别适用于需要频繁插入和删除元素的场景。链表的缺点是随机访问性能较差,需要按顺序遍历查找元素。
  • 顺序表(ArrayList):顺序表是一种线性数据结构,由数组实现。它支持高效的随机访问,因为可以通过索引直接访问元素。但在插入和删除操作中,如果需要移动元素,性能可能较差。
5.3 选择Java LinkedList还是ArrayList:优劣对比

何时选择使用Java LinkedList

  • 当需要频繁插入和删除元素,而不关心随机访问性能时,LinkedList通常更合适。
  • 当实现队列、栈、双端队列等数据结构时,LinkedList通常是更好的选择,因为它的插入和删除操作非常高效。
  • 在处理实时数据流或需要在中间插入/删除元素的情况下,LinkedList可能更适合,因为它不需要元素的移动操作。

何时选择使用Java ArrayList

  • 当需要频繁随机访问元素或迭代集合中的元素时,ArrayList通常更为合适,因为它的性能更好。
  • 当内存使用需求较低或不涉及大规模插入和删除操作时,ArrayList也是一个不错的选择。

在选择LinkedList还是ArrayList时,需要根据具体需求和性能考虑做出决策。了解它们的区别和优劣势可以帮助您在项目中选择适当的数据结构,以满足特定的编程需求

六、性能优化和最佳实践

6.1 Java LinkedList的性能优化技巧

优化Java中的LinkedList性能是重要的,特别是在处理大型数据集时。以下是一些性能优化技巧:

  • 避免频繁使用get(index):如前所述,LinkedList的随机访问效率较低。如果需要频繁访问元素,考虑将元素缓存在局部变量中,以减少不必要的get操作。
  • 使用Iterator进行遍历:使用Iterator而不是增强for循环进行遍历,因为Iterator可以更好地处理链表的结构。遍历时使用listIterator()方法可以在双向链表中进行双向遍历。
  • 注意内存开销:LinkedList需要额外的内存来存储指向前后节点的引用,因此在处理大型数据集时要注意内存开销。确保你有足够的内存来处理数据。
  • 考虑分批操作:如果需要批量插入或删除元素,可以考虑将操作分成多个小批次,以减少元素移动的次数。
  • 使用addFirstaddLast:如果需要在链表的开头或末尾插入元素,使用addFirstaddLast方法,因为它们效率更高。
6.2 链表与顺序表的优势与劣势:Java中如何选择?

链表和顺序表在Java中都有各自的优势和不足。以下是一些考虑因素:

  • 使用链表的情况
    • 当需要频繁插入和删除元素,而不关心随机访问时,链表通常更合适。
    • 在实现队列、栈、双端队列等数据结构时,链表通常是更好的选择,因为它的插入和删除操作非常高效。
    • 在处理实时数据流或需要在中间插入/删除元素的情况下,链表可能更适合,因为它不需要元素的移动操作。
  • 使用顺序表的情况
    • 当需要频繁随机访问元素或迭代集合中的元素时,顺序表(如ArrayList)通常更为合适,因为它的性能更好。
    • 当内存使用需求较低或不涉及大规模插入和删除操作时,顺序表也是一个不错的选择。

在选择链表还是顺序表时,需要根据具体需求和性能考虑做出决策。了解它们的相对优势和不足可以帮助您在Java项目中做出明智的选择,以满足特定的编程需求。同时,性能优化技巧和最佳实践对于确保链表在实际项目中表现出色也非常重要。

七、Java LinkedList的内部实现和工作原理

深入了解Java LinkedList的内部机制和工作原理,为更高级的使用打下基础。


  • 双向链表结构:LinkedList由节点组成,每个节点包含数据和指向前一个节点(前驱)和后一个节点(后继)的引用。这种双向链表结构允许在链表中双向遍历。
  • 头节点和尾节点:LinkedList的头节点是链表的第一个节点,尾节点是链表的最后一个节点。它们分别存储在头部和尾部,允许高效地在链表的开头和末尾执行插入和删除操作。
  • 添加元素:当您向LinkedList添加元素时,它会创建一个新的节点,将数据存储在其中,并将前一个节点和后一个节点的引用正确连接起来,以维护链表的完整性。这使得在链表的开头或末尾添加元素非常高效。
  • 删除元素:删除元素时,LinkedList会调整前一个节点和后一个节点的引用,从而将目标节点从链表中移除。这也是链表在删除操作上高效的原因。
  • 迭代器(Iterator):LinkedList提供了迭代器,用于遍历链表的元素。迭代器允许您在链表中移动并访问各个节点,执行迭代操作。
  • 内部实现细节:Java中的LinkedList是基于Node类实现的,每个Node对象都包含数据和指向前一个节点和后一个节点的引用。链表的头部和尾部分别由特殊的headertail节点表示。

深入了解LinkedList的内部实现和工作原理对于理解其性能和用法非常重要。这种数据结构在特定场景下非常有用,了解它的内部工作方式有助于更好地利用它的特性。在项目中使用LinkedList时,您可以利用这些知识来更好地处理数据和性能需求。

八、高级应用和性能比较

8.1 使用 LinkedList 构建高效数据结构:详细指南

LinkedList 是 Java 中的一个双向链表实现,相较于 ArrayList,它在插入和删除元素时更为高效。在构建高效数据结构时,可以利用 LinkedList 的特性来满足特定需求。以下是一些详细指南:

8.1.1 插入和删除操作

由于 LinkedList 是一个链表,插入和删除操作的时间复杂度为 O(1),这使得它非常适合需要频繁插入和删除操作的场景。在构建高效数据结构时,考虑如何充分利用这一特性,设计数据结构以最大程度地减少元素的移动和复制。

8.1.2 迭代器遍历

LinkedList 提供了迭代器(Iterator)接口,可以通过迭代器高效地遍历元素。在构建高效数据结构时,考虑如何设计迭代器以提高遍历性能。

8.1.3 自定义节点

LinkedList 的节点是双向的,保存了前一个节点和后一个节点的引用。在构建高效数据结构时,可以考虑自定义节点结构,以满足特定的需求。例如,可以添加额外的信息或引用,以提高某些操作的效率。

8.1.4 注意内存占用

虽然 LinkedList 在插入和删除操作上有优势,但它在内存占用上可能较大。在构建高效数据结构时,需要权衡空间复杂度和时间复杂度,确保选择的数据结构符合实际需求。

8.1.5 避免随机访问

LinkedList 的随机访问效率较低,因为要从头或尾开始遍历。在构建高效数据结构时,如果需要频繁进行随机访问,可能需要考虑其他数据结构,比如 ArrayList。

8.2 Java 集合类 LinkedList 和 ArrayList 的性能比较

在选择数据结构时,了解其性能特点是至关重要的。下面是 Java 中 LinkedList 和 ArrayList 的性能比较:

8.2.1 插入和删除操作
  • LinkedList: 插入和删除操作的时间复杂度为 O(1)。在链表中,只需要修改相邻节点的引用即可完成插入和删除。
  • ArrayList: 在插入和删除操作中,涉及到元素的移动,因此时间复杂度为 O(n)。特别是在列表的中间或开头插入/删除元素时,性能相对较差。
8.2.2 随机访问
  • LinkedList: 随机访问的时间复杂度为 O(n),因为必须从头或尾开始遍历链表。
  • ArrayList: 随机访问的时间复杂度为 O(1),因为底层是数组结构,可以通过索引直接访问元素。
8.2.3 空间占用
  • LinkedList: 链表结构需要额外的空间存储节点的引用,可能导致较大的内存占用。
  • ArrayList: 数组结构在存储元素时更加紧凑,通常情况下占用的内存较少。
8.2.4 遍历性能
  • LinkedList: 在迭代(遍历)操作时,由于有指向前后节点的引用,LinkedList 的性能较好。
  • ArrayList: 在迭代操作时,由于底层是数组,ArrayList 的性能也是相当不错的。
8.2.5 选择建议
  • 使用 LinkedList 当:
    • 需要频繁进行插入和删除操作。
    • 对随机访问的性能要求不高。
    • 可以接受较大的内存占用。
  • 使用 ArrayList 当:
    • 需要频繁进行随机访问操作。
    • 对插入和删除的性能要求不是很高。
    • 有限制的内存资源。

在实际项目中,根据具体的使用场景和操作需求,选择合适的集合类是至关重要的。

import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class EfficientDataStructure {

    // Demo for Efficient Data Structure using LinkedList
    public static void main(String[] args) {
        // Creating a custom data structure using LinkedList
        EfficientLinkedListStructure<String> customList = new EfficientLinkedListStructure<>();
    
        // Adding elements to the custom data structure
        customList.add("Element 1");
        customList.add("Element 2");
        customList.add("Element 3");
    
        // Displaying the elements
        System.out.println("Custom List Elements: " + customList);
    
        // Demonstrating efficient traversal using custom iterator
        System.out.print("Custom Iterator Traversal: ");
        ListIterator<String> customIterator = customList.customIterator();
        while (customIterator.hasNext()) {
            System.out.print(customIterator.next() + " ");
        }
    }

}

// Custom data structure using LinkedList
class EfficientLinkedListStructure<E> {
    private LinkedList<E> linkedList;

    // Constructor to initialize the LinkedList
    public EfficientLinkedListStructure() {
        this.linkedList = new LinkedList<>();
    }
    
    // Custom method for adding elements with optimized insertion
    public void add(E element) {
        linkedList.addLast(element);
    }
    
    // Custom iterator for efficient traversal
    public ListIterator<E> customIterator() {
        return linkedList.listIterator();
    }
    
    // Overriding toString for a readable display of elements
    @Override
    public String toString() {
        return linkedList.toString();
    }

}

九、LinkedList的使用案例

在Java开发中,LinkedList的灵活性使其在各种场景中都能发挥重要作用。以下是一个简单的使用案例,演示了如何在实际项目中利用LinkedList解决问题。

9.1 场景描述

假设我们需要实现一个任务管理器,其中包含一组任务,并能够在任务之间进行快速的插入和删除操作。由于任务管理经常涉及到插入和删除,因此选择使用LinkedList来提高操作效率。

9.2 使用LinkedList的任务管理器
import java.util.LinkedList;

class Task {
    String description;

    public Task(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Task: " + description;
    }
}

public class TaskManager {
    private LinkedList<Task> taskList = new LinkedList<>();

    // 添加任务
    public void addTask(String description) {
        Task newTask = new Task(description);
        taskList.addLast(newTask);
        System.out.println("Task added: " + newTask);
    }

    // 移除任务
    public void removeTask(int index) {
        if (index >= 0 && index < taskList.size()) {
            Task removedTask = taskList.remove(index);
            System.out.println("Task removed: " + removedTask);
        } else {
            System.out.println("Invalid index for task removal.");
        }
    }

    // 显示所有任务
    public void displayTasks() {
        System.out.println("Tasks in the Task Manager:");
        for (Task task : taskList) {
            System.out.println(task);
        }
    }

    public static void main(String[] args) {
        TaskManager taskManager = new TaskManager();

        // 添加任务
        taskManager.addTask("Complete Java tutorial");
        taskManager.addTask("Finish project proposal");

        // 显示所有任务
        taskManager.displayTasks();

        // 移除任务
        taskManager.removeTask(1);

        // 显示更新后的任务列表
        taskManager.displayTasks();
    }
}
9.3 案例解释
  • Task 类表示任务,具有描述信息。
  • TaskManager 类使用LinkedList来存储任务列表,并提供了添加、移除和显示任务的方法。
  • main方法中,演示了如何创建任务、显示所有任务、移除任务,并展示了LinkedList在这个任务管理场景中的灵活性。

十、总结

在本文中,我们深入研究了LinkedList的基本概念、高级应用和性能比较,并通过实际案例展示了如何在Java开发中充分利用LinkedList。LinkedList适用于需要频繁插入和删除操作的场景,特别是在任务管理、编辑器撤销操作等方面。在选择数据结构时,根据具体需求和场景特点,LinkedList可以成为Java开发者的强大工具之一。

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟 Junit 框架

需求 定义若干个方法&#xff0c;只要加了MyTest注解&#xff0c;就可以在启动时被触发执行 分析 定义一个自定义注解MyTest&#xff0c;只能注解方法&#xff0c;存活范围是一直都在定义若干个方法&#xff0c;只要有MyTest注解的方法就能在启动时被触发执行&#xff0c;没有这…

开源博客项目Blog .NET Core源码学习(5:mapster使用浅析)

开源博客项目Blog使用mapster框架映射对象&#xff0c;主要是在数据库表对象及前端数据对象之间进行映射&#xff0c;本文学习并记录项目中mapster的使用方式。   App.Hosting项目的program文件中调用builder.Services.AddMapper函数进行对象模型自动映射&#xff0c;而该函数…

numpy矩阵画框框

在n>5(n是奇数)的nn数组中&#xff0c;用*画外方框和内接菱形。 (本笔记适合熟悉numpy的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那…

二维码智慧门牌管理系统升级解决方案:突破传统,实现质检与抽检的个性化配置

文章目录 前言一、引入“独立质检”二、个性化抽检类别设定三、触发重采要素的功能升级四、升级优势与展望 前言 在数字化时代&#xff0c;智慧门牌管理系统已经成为社会管理的重要工具。为了满足各种复杂需求&#xff0c;系统升级是必然趋势。本次升级主要针对质检和抽检两大…

Python+requests+exce接口自动化测试框架

一、接口自动化测试框架 二、工程目录 三、Excel测试用例设计 四、基础数据base 封装post/get&#xff1a;runmethod.py #!/usr/bin/env python3 # -*-coding:utf-8-*- # __author__: hunterimport requests import jsonclass RunMain:def send_get(self, url, data):res req…

Ragnar Locker勒索软件开发者在法国被逮捕

导语&#xff1a;在一次跨国行动中&#xff0c;执法机构逮捕了与Ragnar Locker勒索软件团伙有关的一名恶意软件开发者&#xff0c;并查封了该团伙的暗网网站。Ragnar Locker勒索软件团伙自2020年以来在全球范围内对168家国际公司进行了攻击。此次行动是法国、捷克、德国、意大利…

搭建网站七牛云CDN加速配置

打开七牛云后台&#xff1b;添加域名&#xff1b; 添加需要加速的域名&#xff0c;比如我添加的是motoshare.cn 源站配置&#xff0c;这里要用IP地址&#xff0c;访问的目录下面要有能访问测试的文件&#xff0c;尽量不要用源站域名&#xff0c;这个只能用加速二级域名&#x…

git版本升级

2.17.1之前执行指令&#xff1a;git update(现在大部分应该都不用这个指令&#xff0c;都高于这个版本) 2.17.1之后执行指令&#xff1a;git update-git-for-windows 可通过git --version查看版本 如图所示 等待安装成功即可

蓝桥杯每日一题2023.10.22

题目描述 灵能传输 - 蓝桥云课 (lanqiao.cn) 题目分析 发现每一次的灵能传输都是对前缀和s[i - 1]和s[i]的一次交换 故为求max(s[i], s[i - 1])的最小值&#xff08;发现当s单调时可以成立&#xff09; 由于s[0]和s[n]的位置不变&#xff0c;但是s[0]和s[n]不一定是最大值或…

使用CMake构建一个简单的C++项目

文章目录 一. 构建一个简单的项目二. 构建过程1. 创建程序源文件2. 编写CMakeList.txt文件3. 构建项目并编译源代码 附件 一. 构建一个简单的项目 最基本的CMake项目是从单个源代码文件构建的可执行文件。对于像这样的简单项目&#xff0c;只需要一个包含三个命令的CMakeLists…

Egg.js项目EJS模块引擎

1.介绍 灵活的视图渲染&#xff1a;使用 egg-view-ejs 插件&#xff0c;你可以轻松地在 Egg.js 项目中使用 EJS 模板引擎进行视图渲染。EJS 是一种简洁、灵活的模板语言&#xff0c;可以帮助你构建动态的 HTML 页面。 内置模板缓存&#xff1a;egg-view-ejs 插件内置了模板缓存…

react 学习 —— 16、使用 ref 操作 DOM

什么时候使用 ref 操作 DOM&#xff1f; 有时你可能需要访问由 React 管理的 DOM 元素 —— 例如&#xff0c;让一个节点获得焦点、滚动到它或测量它的尺寸和位置。在 React 中没有内置的方法来做这些事情&#xff0c;所以你需要一个指向 DOM 节点的 ref 来实现。 怎么使用 r…

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合&#xff08;c&#xff09;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…

系统架构师考试科目一:综合知识

某软件公司欲开发一个 Windows 平台上的公告板系统。在明确用户需求后&#xff0c;该公司的 架构师决定采用 Command 模式实现该系统的界面显示部分&#xff0c;并设计 UML 类图如下 图所示。图中与 Command 模式中的 Invoker 角色相对应的类是( ) &#xff0c;与 ConcreteComm…

UE4/5 批量进行贴图Texture压缩、修改饱和度

该插件下载地址&#xff1a; &#x1f35e;正在为您运送作品详情https://mbd.pub/o/bread/ZZWYmpxw 适用于 UE4 4.25/4.26/4.27 UE5 以上版本 在Edit - Plugins中分别开启 插件 Python Editor Script Plugin 插件 Editor Scripting Utilites 如果会python代码&#xff0c;…

KEGG通路图绘制 | ggpathway包

「一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01;」 写在前面 今天在GitHub中看到一个ggpathway的包&#xff0c;主要可以制作通路网络图&#xff0c;或是进一步优化的话&#xff0c;可以进行个性话制作。 操作步骤在GitHub中已经很详细。自己也照葫芦画瓢进行…

ENVI IDL:如何基于面向对象思想进行编程?

最近打算使用markdown语法进行博客的编写&#xff0c;所以风格和格式方面会有区别&#xff0c;见谅。 01 为什么会有这方面的想法&#xff1f; 我惯用python&#xff0c;因此对于IDL进行编程也会有先入为主的想法&#xff0c;它也体现在我的IDL编程中。 02 如何正常编写函数…

codeforces (C++ Morning)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、要将四位数显示&#xff0c;每次操作可以选择移动光标&#xff08;移动到相邻的位置&#xff09;或者显示数字&#xff0c;计算最少需要多少次操作。 2、用flag表示当前光标位置&#xff0c;sum为记录操作次数&#…

【试题039】 多个逻辑或例题

题目&#xff1a;设int n;,执行表达式(n0)||(n1)||(n2)||(n3)后,n的值是&#xff1f;代码分析&#xff1a; //设int n; , 执行表达式(n 0) || (n 1) ||(n 2) ||(n 3)后, n的值是?int n;printf("n%d\n", (n 0) || (n 1) || (n 2) || (n 3));//分析&#xff1…

怎么写一个可以鼠标控制旋转的div?

说在前面 鼠标控制元素旋转在现在也是一个很常见的功能&#xff0c;让我们从实现div元素的旋转控制开始来了解元素旋转的具体原理和实现方法吧。 效果展示 体验地址 https://code.juejin.cn/pen/7290719197439459386 实现步骤 画一个div 首先我们需要先画一个div&#xff0…