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

三、java线性表(顺序表、链表、栈、队列)

java线性表

  • 三、线性表
    • 1.1 顺序表
    • 1.2 链表
      • 1.2.1 单向链表(Singly Linked List)
      • 1.2.2 双向链表(Doubly Linked List)
    • 1.3 LinkedList VS ArrayList
      • 1.3.7 使用 LinkedList 的场景
    • 1.4 栈
    • 1.5 队列

三、线性表

线性表是一种经典的数据结构,它遵循线性逻辑结构的特点。

在Java中,线性表主要通过ArrayList和LinkedList来实现。

1.特点:

  • 数据元素之间具有“一对一”的逻辑关系

  • 第一个数据元素没有前驱,这个数据元素被称为头结点

  • 最后一个数据元素没有后继,这个数据元素被称为尾节点

  • 除了第一个数据元素和最后一个数据元素外,其余的数据元素有且仅有唯一前驱和后继

     前驱元素:若元素A在B元素的前面,则A为B的前驱元素后继元素:若元素B在元素A的后面,则B为A的后继元素
    

2.ArrayList:

  • ArrayList是Java中实现线性表的一种方式,采用顺序存储结构。

  • 优点:访问速度快,支持动态扩展。

  • 缺点:插入和删除操作相对较慢。

    应用场景:适用于查找和访问操作较频繁的场景,如统计数据、存储用户信息等。
    

3.LinkedList:

  • LinkedList是Java中实现线性表的另一种方式,采用链式存储结构。

  • 优点:插入和删除操作快,支持动态扩展。

  • 缺点:访问速度相对较慢。

     应用场景:适用于插入和删除操作较频繁的场景,如队列、栈等。
    

4.线性表的分类

线性表中的数据存储的方式可以是顺序存储,也可以是链式存储

按照数据的存储方式的不同,可以把线性表分为:

  • 顺序表
  • 链表

5.线性表的应用:

  • 排序:线性表可以用于实现各种排序算法,如冒泡排序、快速排序等。

  • 查找:线性表可以用于实现查找算法,如顺序查找、二分查找等。

  • 队列:线性表可以用于实现队列数据结构,遵循“先进先出”(FIFO)的原则。

  • 栈:线性表可以用于实现栈数据结构,遵循“后进先出”(LIFO)的原则。

1.1 顺序表

顺序表的特点是元素在内存中是连续存储的,可以通过索引进行快速的访问。

在 Java 中,顺序表是一种线性表的实现方式,它通过使用数组来存储元素,并按照元素在数组中的位置来建立元素之间的逻辑关系。

在 Java 中,常用的顺序表实现方式是使用 ArrayList 类。ArrayList 是 Java 集合框架中的一员,它实现了动态数组,可以在运行时自动调整大小。以下是对顺序表在 Java 中的使用和特点的详细讲解:

1.1.1 创建顺序表

可以通过实例化 ArrayList 类来创建一个顺序表。例如:

ArrayList<String> list = new ArrayList<>();
	在这个例子中,我们创建了一个名为 `list` 的顺序表,其中存储的元素类型是 String。

1.1.2. 添加元素

可以使用 add 方法向顺序表中添加元素。例如:

list.add("element1");
list.add("element2");
	  在上述代码中,我们向顺序表 `list` 中添加了两个元素。

1.1.3. 访问元素

顺序表中的元素可以通过索引来访问。索引从0开始,表示第一个元素。例如:

String element = list.get(0);
	这个例子中,我们使用 `get` 方法来获取顺序表 `list` 中索引为 0 的元素。

1.1.4. 删除元素

可以使用 remove 方法删除顺序表中的元素。例如:

list.remove(0);
	 这个例子中,我们删除了顺序表 `list` 中索引为 0 的元素。

1.1.5. 修改元素

通过索引可以修改顺序表中的元素。例如:

list.set(0, "newElement");
	 这个例子中,我们将顺序表 `list` 中索引为 0 的元素修改为 "newElement"。

1.1.6. 其他常用操作

  • 获取顺序表的大小:可以使用 size 方法来获取顺序表中元素的个数。

  • 遍历顺序表:可以使用循环结构(如 for-each 循环)来遍历顺序表中的所有元素。

  • 判断顺序表是否为空:可以使用 isEmpty 方法来判断顺序表是否为空。

import java.util.Arrays;class ArrayList {private int size;private int[] elements;private static final int DEFAULT_CAPACITY = 10;public ArrayList() {this.elements = new int[DEFAULT_CAPACITY];this.size = 0;}// 在尾部插入元素public void add(int value) {ensureCapacity(size + 1);elements[size++] = value;}// 在指定位置插入元素public void add(int index, int value) {ensureCapacity(size + 1);if (index < 0 || index > size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}System.arraycopy(elements, index, elements, index + 1, size - index);elements[index] = value;size++;}// 获取指定位置的元素public int get(int index) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}return elements[index];}// 修改指定位置的元素public void set(int index, int value) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}elements[index] = value;}// 删除指定位置的元素public void remove(int index) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}System.arraycopy(elements, index + 1, elements, index, size - index - 1);size--;}// 清空顺序表public void clear() {elements = new int[DEFAULT_CAPACITY];size = 0;}// 获取顺序表的长度public int size() {return size;}// 确保容量大小private void ensureCapacity(int capacity) {if (capacity > elements.length) {int newCapacity = elements.length + (elements.length >> 1);elements = Arrays.copyOf(elements, newCapacity);}}
}// 测试顺序表的代码实现
public class Main {public static void main(String[] args) {ArrayList list = new ArrayList();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println("顺序表的元素:");for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();list.remove(2);list.set(1, 6);System.out.println("删除元素后,修改元素后的顺序表:");for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();}
}
在上面的代码中,我们首先定义了一个顺序表类 ArrayList,其中包含一个动态数组 elements 和当前元素个数 size。
该类提供了以下功能:在尾部插入元素的方法 add在指定位置插入元素的方法 add获取指定位置的元素的方法 get修改指定位置的元素的方法 set删除指定位置的元素的方法 remove清空顺序表的方法 clear获取顺序表的长度的方法 size
其中,为了保证顺序表的容量足够,我们使用了 ensureCapacity 方法来保证容量大小。	
最后,在 Main 类中,我们创建了一个顺序表对象 list,并进行了插入、删除、修改等操作,并最终打印出顺序表的元素。

1.1.7. 动态扩容

   顺序表最大的优点是支持随机访问,但其缺点是一旦初始化大小之后再扩容就需要重新拷贝内存,会浪费大量时间。
为了解决这个问题,Java中的 ArrayList 实现了动态扩容的机制,即在容量不足时自动增加内部数组的大小						以容纳更多元素。这样可以避免因频繁拷贝内存而导致时间浪费的问题。

1.1.8. 规定类型

	ArrayList 在实例化时需要指定列表中元素的类型,这个类型可以是Java中的任何类型,例如 String、Integer、Object 等等。

这个实现方式使得 ArrayList 可以保证存储的元素类型和顺序的一致性。

1.1.9. 基于接口的设计

	 ArrayList 实现了 List 接口,这个接口是 Java 集合框架中的一员。

这种基于接口的设计模式允许开发人员在更高的抽象级别上编程,而不是关注具体实现细节。

1.1.10. 线程不安全

	ArrayList 是非线程安全的,即多个线程并发访问 ArrayList 时,可能会导致数据不一致等问题。为了解决线程不安全的问题,Java 中提供了线程安全的 ArrayList 实现方式,即 Vector 类。Vector 类提供了和 ArrayList 类似的方法,但它是线程安全的,但是其效率比 ArrayList 要低。

1.2 链表

链表由一系列的节点(Node)组成,每个节点包含存储的数据以及一个指向下一个节点的引用。

与数组相比,链表在插入和删除元素时更为高效,但访问特定位置的元素需要遍历整个链表。

Java中常见的链表实现方式有单向链表(Singly Linked List)和双向链表(Doubly Linked List)。

1.2.1 单向链表(Singly Linked List)

单向链表的每个节点包括存储的数据和一个指向下一个节点的引用。最后一个节点的引用为空。

单向链表的优点是实现简单,每个节点只需要保存一个引用。

创建一个单向链表的基本步骤:

  • 创建节点
  • 设置节点的值
  • 设置节点间的引用
public class SinglyLinkedList {private Node head;    // 链表头节点private class Node {int data;        // 节点数据Node next;       // 下一个节点public Node(int data) {this.data = data;this.next = null;}}// 在链表头插入节点public void push(int data) {Node newNode = new Node(data);newNode.next = head;head = newNode;}// 在链表尾部添加节点public void append(int data) {Node newNode = new Node(data);// 如果链表为空,将新节点设置为头节点if (head == null) {head = newNode;return;}Node current = head;// 找到链表最后一个节点while (current.next != null) {current = current.next;}// 将新节点插入到链表最后current.next = newNode;}// 在链表中插入节点public void insert(int data, int position) {Node newNode = new Node(data);// 如果链表为空,将新节点设置为头节点if (head == null) {head = newNode;return;}// 如果插入位置是头节点之前,则将新节点作为头节点if (position <= 0) {newNode.next = head;head = newNode;return;}Node current = head;int i = 1;// 找到插入位置的前一个节点while (current.next != null && i < position) {current = current.next;i++;}// 插入新节点Node temp = current.next;current.next = newNode;newNode.next = temp;}// 删除链表中指定数据的节点public void delete(int data) {if (head == null) {return;}// 处理头节点if (head.data == data) {head = head.next;return;}Node current = head;Node prev = null;// 遍历链表,查找指定数据的节点while (current != null) {if (current.data == data) {prev.next = current.next;return;}prev = current;current = current.next;}}// 打印链表中的所有节点public void printList() {if (head == null) {System.out.println("链表为空");return;}System.out.print("链表元素: ");Node current = head;while (current != null) {System.out.print(current.data + " ");current = current.next;}System.out.println();}public static void main(String[] args) {SinglyLinkedList sll = new SinglyLinkedList();sll.push(1);sll.append(2);sll.append(3);sll.printList();    // 输出:链表元素:1 2 3sll.insert(4, 1);sll.printList();    // 输出:链表元素:1 4 2 3sll.delete(2);sll.printList();    // 输出:链表元素:1 4 3}
}

1.2.2 双向链表(Doubly Linked List)

双向链表的每个节点包含存储的数据、一个指向下一个节点的引用以及一个指向前一个节点的引用。

双向链表的优点是可以从任意一个节点开始正向或反向遍历。双向链表相比单向链表需要额外的空间来存储前一个节点的引用。

在Java中,可以使用内置的 LinkedList 类来实现链表。

可以通过以下几种操作对链表进行操作:

  • 添加元素:使用 add 方法在链表的末尾添加元素,或使用 addFirstaddLast 方法在链表的头部或尾部添加元素。

  • 删除元素:使用 remove 方法按照元素的值或位置删除元素,或使用 removeFirstremoveLast 方法删除链表的头部或尾部元素。

  • 获取元素:使用 get 方法按照索引获取链表中的元素,或使用 getFirstgetLast 方法获取链表的头部或尾部元素。

  • 修改元素:使用 set 方法按照索引修改链表中的元素。

  • 遍历链表:使用循环结构(如 for-each 循环)来遍历链表中的所有元素。

// 定义双链表的节点类
class Node {int data;Node prev;Node next;public Node(int data) {this.data = data;this.prev = null;this.next = null;}
}// 定义双链表类
class DoublyLinkedList {private Node head;public DoublyLinkedList() {this.head = null;}// 在链表头部插入节点public void insertAtHead(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;} else {head.prev = newNode;newNode.next = head;head = newNode;}}// 在链表尾部插入节点public void insertAtTail(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;} else {Node current = head;while (current.next != null) {current = current.next;}current.next = newNode;newNode.prev = current;}}// 打印链表元素public void printList() {Node current = head;System.out.print("双链表的元素:");while (current != null) {System.out.print(current.data + " ");current = current.next;}System.out.println();}
}// 测试双链表的代码实现
public class Main {public static void main(String[] args) {DoublyLinkedList list = new DoublyLinkedList();list.insertAtHead(3);list.insertAtHead(2);list.insertAtHead(1);list.insertAtTail(4);list.insertAtTail(5);list.printList();}
}

1.3 LinkedList VS ArrayList

LinkedList 和 ArrayList 是 Java 中常用的两种列表实现方式,它们的内部实现和使用方式有所不同。

1.3.1 内部实现

  • LinkedList 通过节点之间的引用连接来实现链表。每个节点都包含存储的元素以及指向前一个节点和后一个节点的引用。
  • ArrayList 内部使用动态数组来存储元素。当元素数量超过当前数组容量时,ArrayList 会自动增加内部数组的大小。

1.3.2 插入和删除操作

  • 在索引位置进行插入和删除操作时,LinkedList 有着更好的性能,因为它只需要调整节点之间的引用即可。

  • ArrayList 需要移动后面的元素来保持一致的顺序。

1.3.3 随机访问操作

  • 由于 ArrayList 使用基于数组的实现,它支持通过索引进行高效的随机访问。
  • LinkedList 需要从头节点开始遍历,直到遇到目标索引位置。

1.3.4 内存占用

  • LinkedList 需要为每个节点额外存储前后节点的引用,所以在相同数量元素的情况下,它通常会占用更多的内存。
  • ArrayList 则只需存储元素本身。

1.3.5 迭代器遍历

  • 无论是 LinkedList 还是 ArrayList 都可以通过迭代器(Iterator)来遍历列表。

1.3.6 总结

  • 如果需要频繁进行插入和删除操作,可以考虑使用 LinkedList。

  • 如果需要快速的随机访问和较低的内存消耗,可以使用 ArrayList。

1.3.7 使用 LinkedList 的场景

1.3.7.1 使用场景
LinkedList 在以下场景中可能更加适用:

  • 频繁的插入和删除操作

    由于 LinkedList 的插入和删除操作只需要调整节点之间的引用,所以在频繁进行插入和删除操作的场景下,LinkedList 通常比 ArrayList 更高效。

  • 需要实现队列或栈的功能

    由于 LinkedList 的特点,它很容易实现队列(先进先出)或栈(后进先出)的功能。

     例如,可以使用 addFirst 和 removeFirst 方法在链表的头部进行插入和删除操作,从而实现栈的功能。
    
  • 需要用作缓存或缓冲区

    LinkedList 可以方便地进行头部或尾部的添加和删除操作,这使得它非常适合用作缓存或缓冲区

     例如实现 LRU 缓存算法。
    
  • 少量元素和迭代遍历

    相比 ArrayList,LinkedList 在内存占用上通常更高,所以当列表中的元素数量较少时,使用 LinkedList 可能更加合适。此外,LinkedList 可以通过迭代器进行遍历,适用于需要随机访问的场景。

1.3.7.2 注意事项

在使用 LinkedList 时,需要注意以下几点:

  • 非线程安全

    LinkedList 不是线程安全的,如果需要在多线程环境中使用,需要进行适当的同步或使用线程安全的列表实现,如 Vector 或 CopyOnWriteArrayList。

  • 内存占用

    由于需要为每个节点额外存储前后节点的引用,LinkedList 在相同数量元素的情况下可能会占用更多的内存。因此,当需要存储大量元素时需要注意内存消耗的问题。

  • 遍历和随机访问操作

    相对于 ArrayList,LinkedList 的遍历和随机访问效率较低。如果需要快速地随机访问元素或遍历整个列表,请考虑使用其他的列表实现方式。

  • 性能问题

    在实际的应用中,LinkedList 需要在空间和时间上权衡性能。在某些情况下,LinkedList 的性能可能不如其他的列表实现方式。因此,在选择使用 LinkedList 时,需要结合具体的应用场景和性能需求做出选择。

     总而言之,LinkedList 适用于频繁的插入和删除操作、实现队列或栈的功能、用作缓存或缓冲区等场景。当元素数量较少且需要迭代遍历时,也可以考虑使用 LinkedList。需要注意的是,LinkedList 是非线程安全的,如果在多线程环境中使用链表,需要进行适当的同步。
    

综上所述,Java中提供了内置的 LinkedList 类来实现链表。

链表适用于频繁的插入和删除操作,但访问特定位置的元素效率较低。

使用链表时,需要注意其线程安全性,并根据需要选择单向链表或双向链表的实现方式。

1.4 栈

在Java中,栈(Stack)是一种基于后进先出(LIFO)原则的数据结构。

它可以看作是一种特殊的线性表,只允许在表的一端进行插入和删除操作,这一端被称为栈顶。

Java中提供了栈的标准实现类,即java.util.Stack类。除了Stack类,还可以使用ArrayDeque类来实现栈的功能。

栈的主要特点:

  1. 后进先出(LIFO)的原则:最后插入的元素首先被访问或删除。

  2. 只允许在栈顶进行操作:栈的插入操作通常被称为推入(push),删除操作通常被称为弹出(pop)。

下面是使用Stack类实现栈的基本操作的示例代码:

import java.util.Stack;public class StackExample {public static void main(String[] args) {// 创建一个空栈Stack<Integer> stack = new Stack<>();// 推入元素到栈中stack.push(10);stack.push(20);stack.push(30);// 弹出栈顶元素int top = stack.pop();System.out.println("弹出的栈顶元素为:" + top);// 获取栈顶元素但不弹出int peekTop = stack.peek();System.out.println("当前栈顶元素为:" + peekTop);// 判断栈是否为空boolean isEmpty = stack.isEmpty();System.out.println("栈是否为空:" + isEmpty);// 获取栈的大小int size = stack.size();System.out.println("栈的大小为:" + size);}
}

输出结果:

弹出的栈顶元素为:30
当前栈顶元素为:20
栈是否为空:false
栈的大小为:2

除了pushpoppeekisEmptysize等基本操作,Stack类还提供了其他一些有用的方法,如search方法用于查询一个元素在栈中的位置,elementAt方法用于获取栈中指定位置的元素等。

需要注意的是,Stack类是线程安全的,如果需要在多线程环境中使用,可以考虑使用java.util.concurrent.ConcurrentLinkedDeque类作为线程安全的栈实现。

1.5 队列

在Java中,队列(Queue)是一种基于先进先出(FIFO)原则的数据结构。

队列可以看作是一种特殊的线性表,只允许在表的一端进行插入操作(入队),在另一端进行删除操作(出队)。

Java中提供了多种队列的实现类,常用的有java.util.LinkedListjava.util.ArrayDeque,以及java.util.concurrent.ArrayBlockingQueuejava.util.concurrent.LinkedBlockingQueue等线程安全的队列实现类。

队列的主要特点:

  1. 先进先出(FIFO)原则:首先插入的元素首先被访问或删除。

  2. 只允许在队尾插入元素,在队头删除元素。

下面是使用LinkedList实现队列的基本操作的示例代码:

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {// 创建一个队列Queue<Integer> queue = new LinkedList<>();// 入队操作queue.offer(10);queue.offer(20);queue.offer(30);// 出队操作int front = queue.poll();System.out.println("出队元素为:" + front);// 获取队头元素但不出队int peekFront = queue.peek();System.out.println("当前队头元素为:" + peekFront);// 判断队列是否为空boolean isEmpty = queue.isEmpty();System.out.println("队列是否为空:" + isEmpty);// 获取队列的大小int size = queue.size();System.out.println("队列的大小为:" + size);}
}

输出结果:

出队元素为:10
当前队头元素为:20
队列是否为空:false
队列的大小为:2

除了offerpollpeekisEmptysize等基本操作,队列实现类还提供了其他一些有用的方法,如element方法用于获取队头元素但不出队,remove方法用于删除队头元素等。

需要注意的是,LinkedList是非线程安全的队列实现类,如果需要在多线程环境中使用,可以考虑使用java.util.concurrent包下的线程安全队列实现类。

相关文章:

三、java线性表(顺序表、链表、栈、队列)

java线性表 三、线性表1.1 顺序表1.2 链表1.2.1 单向链表&#xff08;Singly Linked List&#xff09;1.2.2 双向链表&#xff08;Doubly Linked List&#xff09; 1.3 LinkedList VS ArrayList1.3.7 使用 LinkedList 的场景 1.4 栈1.5 队列 三、线性表 线性表是一种经典的数据…...

PiflowX-MysqlCdc组件

MysqlCdc组件 组件说明 MySQL CDC连接器允许从MySQL数据库读取快照数据和增量数据。 计算引擎 flink 组件分组 cdc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子hostnameHostname“”无是MySQL…...

2023春季李宏毅机器学习笔记 03 :机器如何生成文句

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、大语言模型的两种…...

dplayer播放hls格式视频并自动开始播放

监控视频流为hls格式&#xff0c;需要打开或刷新页面自动开始播放&#xff0c;需要安装dplayer和hls.js插件&#xff0c;插件直接npm装就行&#xff0c;上代码 import DPlayer from dplayer import Hls from hls.js //jquery是用来注册点击事件&#xff0c;实现自动开始播放 i…...

使用Vivado Design Suite平台板、将IP目录与平台板流一起使用

使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板&#xff08;TDP&#xff09;创建项目&#xff0c;或者已经添加到板库的用户指定板。当您选择特定板&#xff0c;Vivado设计工具显示有关板的信息&#xff0c;并启用其他设计器作为IP定制的一部分以…...

PACS医学影像报告管理系统源码带CT三维后处理技术

PACS从各种医学影像检查设备中获取、存储、处理影像数据&#xff0c;传输到体检信息系统中&#xff0c;生成图文并茂的体检报告&#xff0c;满足体检中心高水准、高效率影像处理的需要。 自主知识产权&#xff1a;拥有完整知识产权&#xff0c;能够同其他模块无缝对接 国际标准…...

介绍几种常见的质数筛选法

质数筛选法 1.暴力筛选法 :smirk:2.普通优化 :rofl:3.埃氏筛法:cold_sweat:4.线性筛选法:scream: 质数&#xff1a;除了1和他本身没有其它因数的正整数就是质数。1不是质数&#xff0c;2是质数。 1.暴力筛选法 &#x1f60f; 原理 求x的质数&#xff0c;令y从2到 x \sqrt[]{x…...

Qt/QML编程学习之心得:Linux下读写GPIO(23)

在linux嵌入式系统中,经常需要一些底层操作,Linux就如window一样,也对底层BSP进行了封装,对device driver进行了封装,使用的话基本就是文件读写的方式来读取,所以也大大简化了上层应用对底层硬件的访问难度。 比如要对GPIO口进行访问,在Qt中有几种方法: 使用命令行方…...

Unity中URP下深度图的线性转化

文章目录 前言一、_ZBufferParams参数有两组值二、LinearEyeDepth1、使用2、Unity源码推导&#xff1a;3、使用矩阵推导&#xff1a; 三、Linear01Depth1、使用2、Unity源码推导3、数学推导&#xff1a; 前言 在之前的文章中&#xff0c;我们实现了对深度图的使用。因为&#…...

Low Poly Cartoon House Interiors

400个独特的低多边形预制件的集合,可以轻松创建高质量的室内场景。所有模型都已准备好放入场景中,并使用一个纹理创建,以提高性能!包含演示场景! 模型分类: - 墙壁(79件) - 地板(28块) - 浴室(33个) - 厨房(36件) - 厨房道具(68件) - 房间道具(85件) - 灯具(…...

[算法与数据结构][c++]:左值、右值、左值引用、右值引用和std::move()

左值、右值、左值引用、右值引用和std::move 1. 什么是左值、右值2. 什么是左值引用、右值引用3. **右值引用和std::move的应用场景**3.1 实现移动语义3.2 **实例&#xff1a;vector::push_back使用std::move提高性能** **4. 完美转发 std::forward**5. Reference 写在前面&…...

【QT】day3

1.登陆界面 2.登陆失败 3.登陆成功弹窗 4.点击OK后跳转 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow…...

c++ fork, execl 参数 logcat | grep

Linux进程编程(PS: exec族函数、system、popen函数)_linux popen函数会新建进程吗-CSDN博客 execvp函数详解_如何在C / C 中使用execvp&#xff08;&#xff09;函数-CSDN博客 C语言的多进程fork()、函数exec*()、system()与popen()函数_c语言 多进程-CSDN博客 Linux---fork…...

QT:单例

单例的定义 官方定义&#xff1a;单例是指确保一个类在任何情况下都绝对只有一个实例&#xff0c;并提供一个全局访问点。 单例的写法 抓住3点&#xff1a; 构造函数私有化&#xff08;确保只有一个实例&#xff09;提供一个可以获取构造实例的接口&#xff08;提供唯一的实…...

IPv6路由协议---IPv6动态路由(OSPFv3-4)

OSPFv3的链路状态通告LSA类型 链路状态通告是OSPFv3进行路由计算的关键依据,链路状态通告包含链路状态类型、链路状态ID、通告路由器三元组唯一地标识了一个LSA。 OSPFv3的LSA头仍然保持20字节,但是内容变化了。在LSA头中,OSPFv2的LS age、Advertising Router、LS Sequence…...

移动通信原理与关键技术学习(4)

1.小尺度衰落 Small-Scale Fading 由于收到的信号是由通过不同的多径到达的信号的总和&#xff0c;接收信号的增强有一定的减小。 小尺度衰落的特点&#xff1a; 信号强度在很小的传播距离或时间间隔内的快速变化&#xff1b;不同多径信号多普勒频移引起的随机调频&#xff…...

第二百五十八回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"模拟对话窗口的页面"相关的内容&#xff0c;本章回中将介绍如何创建一个可以输入内容的对话框.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念…...

freesurfer-reconall后批量提取TIV(颅内总体积)

#提取TIV #singleline=$(grep Estimated Total Intracranial Volume /usr/local/freesurfer/subjects/bect-3d+bold-wangjingchen-4.9y-2/stats/aseg.sta...

【GO】如何用 Golang 的 os/exec 执行 pipe 替换文件

背景 主要记录一下怎么用 Golang 的 os/exec 去执行一个 cmd 的 pipeline&#xff0c;就是拿 cmdA 的输出作为 cmdB 的输入&#xff0c;这里记录了两种方法去替换文件里面的字符串。 pipe 那个逻辑在 demo1 里。 另外一种是直接读文件做替换&#xff0c;一不小心两个都放进来了…...

基于Spring-boot-websocket的聊天应用开发总结

目录 1.概述 1.1 Websocket 1.2 STOMP 1.3 源码 2.Springboot集成WS 2.1 添加依赖 2.2 ws配置 2.2.1 WebSocketMessageBrokerConfigurer 2.2.2 ChatController 2.2.3 ChatInRoomController 2.2.4 ChatToUserController 2.3 前端聊天配置 2.3.1 index.html和main.j…...

2023年度总结 - 职业生涯第一个十年

2023年只剩下最后一周&#xff0c;又到了一年一度该做年末总结的时候了。 回想起去年&#xff0c;还有人专门建立了一个关于年度总结文章汇总的仓库。读了很多篇别人写的&#xff0c;给了我很多的触动和感想。这里的每篇文章都是关于某个人这一整年的生活和工作的轨迹啊。即使你…...

setup 语法糖

只有vue3.2以上版本可以使用 优点&#xff1a; 更少的样板内容&#xff0c;更简洁的代码 能够使用纯 Typescript 声明props 和抛出事件 更好的运行时性能 更好的IDE类型推断性能 在sciprt标识上加上setup 顶层绑定都可以使用 不需要return &#xff0c;可以直接使用 使用组件…...

Javaweb之Mybatis的基础操作的详细解析

1. Mybatis基础操作 学习完mybatis入门后&#xff0c;我们继续学习mybatis基础操作。 1.1 需求 需求说明 通过分析以上的页面原型和需求&#xff0c;我们确定了功能列表&#xff1a; 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除 …...

知名开发者社区Stack Overflow发布《2023 年开发者调查报告》

Stack Overflow成立于2008年&#xff0c;最知名的是它的公共问答平台&#xff0c;每月有超过 1 亿人访问该平台来提问、学习和分享技术知识。是世界上最受欢迎的开发者社区之一。每年都会发布一份关于开发者的调查报告&#xff0c;来了解不断变化的开发人员现状、正在兴起或衰落…...

vue element plus Form 表单

表单包含 输入框, 单选框, 下拉选择, 多选框 等用户输入的组件。 使用表单&#xff0c;您可以收集、验证和提交数据。 TIP Form 组件已经从 2. x 的 Float 布局升级为 Flex 布局。 典型表单# 最基础的表单包括各种输入表单项&#xff0c;比如input、select、radio、checkbo…...

zmq_connect和zmq_poll

文章内容&#xff1a; 介绍函数zmq_connect和zmq_poll的使用 zmq_connect zmq_connect函数是ZeroMQ库中的一个函数&#xff0c;用于在C语言中创建一个与指定地址的ZeroMQ套接字的连接。该函数的原型如下&#xff1a; int zmq_connect(void *socket, const char *endpoint);其…...

TinyLog iOS v3.0接入文档

1.背景 为在线教育部提供高效、安全、易用的日志组件。 2.功能介绍 2.1 日志格式化 目前输出的日志格式如下&#xff1a; 日志级别/[YYYY-MM-DD HH:MM:SS MS] TinyLog-Tag: |线程| 代码文件名:行数|函数名|日志输出内容触发flush到文件的时机&#xff1a; 每15分钟定时触发…...

react-native 配置@符号绝对路径配置和绝对路径没有提示的问题

这里需要用到vscode的包 yarn add babel-plugin-module-resolver 找到根目录里的babel.config.js 在页面添加plugins配置 直接替换 module.exports {presets: [module:metro-react-native-babel-preset],plugins: [[module-resolver,{root: [./src],alias: {/utils: ./src/…...

element的Table表格组件树形数据与懒加载简单使用

目录 1. 代码实现2. 效果图3. 解决新增、删除、修改之后树节点不刷新问题。&#xff08;[参考文章](https://blog.csdn.net/weixin_41549971/article/details/135504471)&#xff09; 1. 代码实现 <template><div><!-- lazy 是否懒加载子节点数据 --><!-…...

游戏、设计选什么内存条?光威龙武系列DDR5量大管饱

如果你是一位PC玩家或者创作者&#xff0c;日常工作娱乐中&#xff0c;确实少不了大容量高频内存的支持&#xff0c;这样可以获得更高的工作效率&#xff0c;光威龙武系列DDR5内存条无疑是理想之选。它可以为计算机提供强劲的性能表现和稳定的运行体验&#xff0c;让我们畅玩游…...

做销售用什么网站好/百度关键词搜索技巧

已经在PHP中使用crypt创建了一个哈希密码&#xff0c;并希望在Python中使用crypt模块进行哈希处理。我怎么能做到呢&#xff1f;在这是我的PHP代码&#xff1a;function generateSalt($cost 10) {if (!is_numeric($cost) || $cost < 4 || $cost > 31) {throw new CExcep…...

东莞网站建设服务有什么用/seo搜索引擎优化总结报告

转载自&#xff1a; http://blog.csdn.net/u014610226/article/details/47679323 以下是对C中不能重载为友元函数的四个运算符进行了详细的分析介绍&#xff0c;需要的朋友可以过来参考下 C规定有四个运算符 , ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)&…...

网站建设步骤电脑/如何创建网站教程

for counter in range( 10 ): print counter #打印for语句的每个计算器...

平台门户网站建设/最好的网站设计公司

表格是我们平常办公的时候非常常见的文档数据&#xff0c;表格工具也给我们提供了非常强大的功能&#xff0c;提高了我们办公的效率。不过在计算机中&#xff0c;表格的编辑也是非常多种多样的&#xff0c;除了Excel外&#xff0c;word等一些办公软件也能够编辑表格&#xff0c…...

php做的卖水果网站有哪些/系统优化软件

在我还没有踏入测试领域的时候&#xff0c;就知道了自动化测试与手工测试的争论&#xff0c;现在&#xff0c;我就以我们公司的项目为例&#xff0c;讲述一下我认知的手工测试与自动化测试。 因为保密原则&#xff0c;不方便透漏项目的名字&#xff0c;就以项目表示了。我的工作…...

做网站没有学历的人会吗/优化关键词排名工具

阅读软件工程与计算机科学区别的文章&#xff0c;谈谈你的看法 从范围上来讲软件工程是一项工程&#xff0c;计算机科学是一个领域&#xff0c;所以计算机科学更广。 软件工程&#xff1a;诠释的是一项工程&#xff0c;主要内容是如何去规划和设计一个项目&#xff0c;让人们在…...