Java面试八股文宝典:初识数据结构-数组

数组(Array)

数组是计算机编程中最基本的数据结构之一。它是一个有序的元素集合,每个元素都可以通过索引进行访问。本文将详细介绍数组的特性、用法和注意事项。

数组的基本特性

数组具有以下基本特性:

  • 有序性: 数组中的元素是有序排列的,可以通过索引访问。
  • 固定长度: 数组的长度在创建时固定,无法动态改变。
  • 相同数据类型: 数组中的元素通常是相同数据类型的。

示例代码 - 创建和访问数组

让我们首先了解如何创建和访问数组:

// 创建一个整数数组
int[] numbers = new int[5];// 插入元素
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;// 访问元素
int thirdNumber = numbers[2]; // 访问第三个元素,值为3

数组的源码分析

数组是一种非常基础的数据结构,通常由编程语言的底层机制直接支持。在 Java 中,数组是通过内存分配和索引访问实现的。你可以在 Java 的 java.util 包中找到一些与数组相关的工具类和方法,如 Arrays 类。

注意事项

在使用数组时,需要注意以下事项:

  • 固定长度: 数组的长度一旦确定,就无法更改。如果需要动态添加或删除元素,可能需要使用其他数据结构。
  • 索引越界: 访问数组元素时必须确保索引在有效范围内,否则会导致索引越界异常。
  • 内存占用: 数组的内存占用是固定的,如果分配了过多的空间,可能会浪费内存。

数组的使用场景

数组在许多场景下都非常有用,包括:

  • 列表存储: 数组可以用来存储列表数据,如学生成绩、购物清单等。
  • 数据检索: 由于数组的有序性,可以快速检索元素,例如查找最大值或最小值。
  • 算法实现: 数组是许多算法的基础,如排序算法和搜索算法。

主要知识点讲解

动态数组和静态数组的区别

动态数组和静态数组是两种常见的数组类型,它们在内存管理和使用灵活性方面存在显著的区别。以下是它们的主要区别:

  1. 大小变化:

    • 静态数组: 静态数组在创建时需要指定固定的大小,一旦分配了空间,大小不能更改。如果需要更多的存储空间,必须创建一个新的数组,将数据复制到新数组中,然后释放旧数组。这导致了内存的浪费和复杂的操作。
    • 动态数组: 动态数组在创建时可以指定初始大小,但如果数组元素数量超过当前容量,动态数组会自动扩展,分配更多的内存空间。这使得动态数组能够有效地处理大小变化的数据。
  2. 内存管理:

    • 静态数组: 静态数组在创建时分配了固定大小的内存,因此可能浪费内存(如果未充分利用)或不足以存储所有数据(如果超过容量)。
    • 动态数组: 动态数组能够根据需要分配和释放内存,以适应数据的大小。这减少了内存浪费,并确保有效使用可用内存。
  3. 使用灵活性:

    • 静态数组: 静态数组的大小是固定的,因此对于不同大小的数据集可能不够灵活。如果需要存储的数据数量不确定,静态数组可能无法满足需求。
    • 动态数组: 动态数组的大小可以动态增加,因此适用于处理不同大小的数据集。这使得它们更灵活且适用于各种情况。
  4. 实现复杂度:

    • 静态数组: 静态数组的实现通常比较简单,因为它们不需要处理大小变化的逻辑。
    • 动态数组: 动态数组的实现相对复杂,因为它们需要管理内存分配和复制数据的逻辑。通常,动态数组使用静态数组作为底层存储,以便动态扩展和收缩。

综上所述,动态数组在处理不确定数据大小的情况下更为灵活和高效,因为它们可以自动调整大小,而静态数组则需要在创建时指定大小,并且无法轻松适应不同的数据集。因此,大多数编程语言和应用程序更倾向于使用动态数组或提供动态数组的数据结构,如 Java 中的 ArrayList 或 Python 中的列表。

以下是Java中的一个简单示例,展示了静态数组和动态数组(ArrayList)的用法,以及它们之间的一些主要区别:

import java.util.ArrayList;public class ArrayExample {public static void main(String[] args) {// 静态数组(固定大小)int[] staticArray = new int[5]; // 创建一个包含5个整数的静态数组staticArray[0] = 10;staticArray[1] = 20;staticArray[2] = 30;staticArray[3] = 40;staticArray[4] = 50;// 注意:静态数组大小不可更改// staticArray[5] = 60; // 这将导致数组越界错误System.out.println("静态数组元素:");for (int i = 0; i < staticArray.length; i++) {System.out.print(staticArray[i] + " ");}System.out.println();// 动态数组(ArrayList)ArrayList<Integer> dynamicArray = new ArrayList<Integer>(); // 创建一个空的动态数组dynamicArray.add(10);dynamicArray.add(20);dynamicArray.add(30);System.out.println("动态数组元素:");for (int i = 0; i < dynamicArray.size(); i++) {System.out.print(dynamicArray.get(i) + " ");}System.out.println();// 动态数组可以根据需要自动扩展dynamicArray.add(40);dynamicArray.add(50);System.out.println("动态数组元素(添加后):");for (int i = 0; i < dynamicArray.size(); i++) {System.out.print(dynamicArray.get(i) + " ");}System.out.println();}
}

在这个示例中,我们首先创建了一个静态数组 staticArray 和一个动态数组 dynamicArray(使用 ArrayList 实现)。静态数组的大小在创建时固定,无法更改,而动态数组可以根据需要自动扩展。我们演示了如何向这两种数组中添加和访问元素。

请注意,在使用动态数组时,我们使用 ArrayListadd 方法来添加元素,而使用 sizeget 方法来访问元素。此外,动态数组的大小可以根据添加的元素自动增长,而静态数组的大小是固定的。

当进一步扩展示例以更好地理解静态数组和动态数组之间的差异时,我们可以考虑以下方面:

  1. 动态数组的自动扩展: 通过向动态数组添加元素来展示其自动扩展的特性。

  2. 静态数组的大小限制: 展示静态数组的大小限制以及如何处理超出容量的情况。

  3. 性能比较: 比较静态数组和动态数组在插入、删除和访问元素方面的性能差异。

下面是一个扩展示例,演示了这些方面的比较:

import java.util.ArrayList;public class ArrayExample {public static void main(String[] args) {// 静态数组(固定大小)int[] staticArray = new int[5];// 添加元素到静态数组for (int i = 0; i < staticArray.length; i++) {staticArray[i] = i * 10;}// 试图添加超出容量的元素// staticArray[5] = 50; // 这将导致数组越界错误// 动态数组(ArrayList)ArrayList<Integer> dynamicArray = new ArrayList<Integer>();// 添加元素到动态数组for (int i = 0; i < 5; i++) {dynamicArray.add(i * 10);}// 展示动态数组的大小自动扩展for (int i = 5; i < 10; i++) {dynamicArray.add(i * 10);}// 访问静态数组的元素System.out.println("静态数组元素:");for (int i = 0; i < staticArray.length; i++) {System.out.print(staticArray[i] + " ");}System.out.println();// 访问动态数组的元素System.out.println("动态数组元素:");for (int i = 0; i < dynamicArray.size(); i++) {System.out.print(dynamicArray.get(i) + " ");}System.out.println();// 比较静态数组和动态数组的性能long startTime = System.nanoTime();// 在静态数组中执行一系列操作long endTime = System.nanoTime();System.out.println("静态数组操作耗时:" + (endTime - startTime) + "纳秒");startTime = System.nanoTime();// 在动态数组中执行相同系列操作endTime = System.nanoTime();System.out.println("动态数组操作耗时:" + (endTime - startTime) + "纳秒");}
}

在这个扩展示例中,我们添加了更多元素到动态数组,展示了其自动扩展的特性。我们还演示了如何访问静态数组和动态数组的元素,并进行性能比较。

请注意,在性能比较方面,动态数组通常具有更好的性能,因为它可以自动扩展,而不需要手动管理容量。但这也取决于具体的操作和场景。

多维数组的概念和使用

多维数组是一种特殊类型的数组,它可以包含其他数组作为其元素,从而形成多维数据结构。多维数组在处理复杂的数据和表格时非常有用,通常用于表示矩阵、图像、表格等具有多个维度的数据集。

以下是多维数组的概念和使用示例:

多维数组的概念

多维数组是一个包含多个维度的数组,每个维度都可以看作是一个单独的数组。通常,我们使用二维数组和三维数组最为常见,但我们可以创建具有任意数量维度的多维数组。

  • 二维数组: 二维数组是一个表格状的数组,具有行和列。它可以看作是一个数组的数组,其中每个元素是一个数组,代表一行或一列的数据。

  • 三维数组: 三维数组可以被视为一堆二维数组。每个元素是一个二维数组,代表了一个平面或一层的数据。

  • 多维数组: 多维数组可以扩展到更多的维度,例如四维数组、五维数组等。每个维度都会增加一个方向,用于组织数据。

多维数组的声明和初始化

在Java中,声明和初始化多维数组的语法如下:

// 声明和初始化二维数组
dataType[][] arrayName = new dataType[rows][columns];// 例如,创建一个3x4的整数二维数组
int[][] twoDArray = new int[3][4];// 声明和初始化三维数组
dataType[][][] arrayName = new dataType[depth][rows][columns];// 例如,创建一个2x3x4的整数三维数组
int[][][] threeDArray = new int[2][3][4];

多维数组的访问和操作

多维数组的访问和操作涉及到多个索引,每个索引对应一个维度。例如,对于二维数组:

int value = twoDArray[rowIndex][columnIndex];

对于三维数组:

int value = threeDArray[layerIndex][rowIndex][columnIndex];

我们可以使用嵌套的循环来遍历和操作多维数组的元素,例如:

// 遍历二维数组
for (int i = 0; i < rows; i++) {for (int j = 0; j < columns; j++) {int value = twoDArray[i][j];// 进行操作}
}// 遍历三维数组
for (int i = 0; i < depth; i++) {for (int j = 0; j < rows; j++) {for (int k = 0; k < columns; k++) {int value = threeDArray[i][j][k];// 进行操作}}
}

示例:二维数组的应用

以下是一个示例,演示了如何使用二维数组表示一个矩阵,并进行一些基本的操作:

public class TwoDArrayExample {public static void main(String[] args) {// 创建一个3x4的整数二维数组int[][] matrix = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};// 访问元素int value = matrix[1][2]; // 访问第2行第3列的元素(值为7)// 遍历并打印矩阵for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println();}}
}

这个示例创建了一个3x4的整数二维数组,访问了其中的元素,并遍历了整个矩阵。

多维数组在编程中具有广泛的应用,尤其是在处理矩阵、图像、游戏地图等需要多维数据结构的场景中。通过多维数组,我们可以更方便地组织和访问复杂的数据。

多维数组是一种包含多个维度的数组,每个维度可以看作是一个单独的数组。它们用于表示多维数据结构,例如矩阵、立方体、三维坐标等。在多维数组中,每个元素都由多个索引确定,每个索引对应一个维度。

以下是多维数组的更详细描述和代码示例:

二维数组

二维数组是最常见的多维数组类型,它包含两个维度:行和列。在Java中,可以通过嵌套数组来创建二维数组。下面是一个示例:

// 创建一个3x3的整数二维数组
int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 访问元素
int value = matrix[1][2]; // 访问第2行第3列的元素(值为6)

三维数组

三维数组包含三个维度,通常用于表示立体数据。在Java中,可以使用嵌套的数组来创建三维数组。以下是一个示例:

// 创建一个2x3x4的整数三维数组
int[][][] cube = {{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}},{{13, 14, 15, 16},{17, 18, 19, 20},{21, 22, 23, 24}}
};// 访问元素
int value = cube[1][2][3]; // 访问第2层、第3行、第4列的元素(值为24)

多维数组的遍历

遍历多维数组需要嵌套循环,每个维度一个循环。以下是遍历二维数组和三维数组的示例:

// 遍历二维数组
for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {int value = matrix[i][j];// 进行操作}
}// 遍历三维数组
for (int i = 0; i < cube.length; i++) {for (int j = 0; j < cube[i].length; j++) {for (int k = 0; k < cube[i][j].length; k++) {int value = cube[i][j][k];// 进行操作}}
}

多维数组的应用

多维数组在编程中有许多应用,例如:

  • 图像处理: 图像通常表示为二维数组,其中每个元素代表像素的颜色或亮度值。

  • 游戏开发: 游戏地图、三维模型等数据可以使用多维数组表示。

  • 科学计算: 在科学和工程领域中,多维数组用于表示复杂的数据集,如物理模拟、地理信息系统(GIS)等。

  • 数据分析: 在数据分析和机器学习中,多维数组用于存储和处理大规模数据集。

多维数组在处理需要多个维度的数据时非常有用,它们提供了一种有效的方式来组织和访问这些数据。根据需求,我们可以创建具有更多维度的多维数组,以满足特定的应用需求。

数组的时间复杂度分析,包括插入、删除和查找操作的性能分析

数组是一种基本的数据结构,其性能分析涉及到插入、删除和查找操作的时间复杂度。下面是关于数组各种操作的时间复杂度分析:

  1. 插入操作:

    • 在末尾插入元素(尾部插入):插入操作的时间复杂度为 O(1)。因为在数组末尾添加元素不需要移动其他元素,只需将新元素放在最后即可。

    • 在中间或开头插入元素:如果要在数组中间或开头插入元素,需要将插入位置之后的所有元素都向后移动一个位置。这样的操作的时间复杂度是 O(n),其中 n 是数组中的元素数量,因为它需要线性时间来移动元素。

  2. 删除操作:

    • 删除末尾元素(尾部删除):与插入类似,删除操作的时间复杂度为 O(1)。只需将末尾元素标记为删除即可,不需要移动其他元素。

    • 删除中间或开头元素:与插入相同,删除中间或开头的元素需要将删除位置之后的所有元素向前移动一个位置,时间复杂度为 O(n)。

  3. 查找操作:

    • 按索引查找元素:查找特定索引位置的元素的时间复杂度是 O(1)。因为可以通过数组的索引直接访问元素。

    • 线性查找:如果需要在数组中查找特定值,且数组未排序,那么最坏情况下需要遍历整个数组,时间复杂度为 O(n)。

    • 二分查找:如果数组已排序,可以使用二分查找来提高查找效率,时间复杂度为 O(log n)。但前提是数组必须是有序的。

总结:

  • 插入和删除操作的性能受到插入或删除的位置以及元素数量的影响。在尾部插入或删除元素时性能最好,时间复杂度为 O(1),而在中间或开头插入或删除元素时性能较差,时间复杂度为 O(n)。

  • 查找操作的性能取决于具体情况。按索引查找元素的时间复杂度为 O(1)。在无序数组中线性查找的时间复杂度为 O(n),而在有序数组中二分查找的时间复杂度为 O(log n)。

因此,对于需要频繁进行插入、删除和查找操作的情况,可能需要考虑使用其他数据结构,如链表或哈希表,以获得更好的性能。数组在具体应用中的选择应根据操作的频率和性能要求来决定。
以下是关于数组插入、删除和查找操作的Java代码示例:

import java.util.Arrays;public class ArrayOperationsExample {public static void main(String[] args) {// 创建一个整数数组int[] arr = {10, 20, 30, 40, 50};// 打印原始数组System.out.println("原始数组:" + Arrays.toString(arr));// 插入操作int insertValue = 60;int insertIndex = 2; // 在索引2处插入元素insertElement(arr, insertValue, insertIndex);System.out.println("插入元素 " + insertValue + " 后的数组:" + Arrays.toString(arr));// 删除操作int deleteIndex = 3; // 删除索引3处的元素deleteElement(arr, deleteIndex);System.out.println("删除索引 " + deleteIndex + " 处的元素后的数组:" + Arrays.toString(arr));// 查找操作int searchValue = 30;int searchIndex = searchElement(arr, searchValue);if (searchIndex != -1) {System.out.println("元素 " + searchValue + " 在数组中的索引位置为 " + searchIndex);} else {System.out.println("元素 " + searchValue + " 不在数组中。");}}// 插入元素public static void insertElement(int[] arr, int value, int index) {if (index < 0 || index > arr.length) {System.out.println("插入位置无效。");return;}// 创建一个新数组,比原数组多一个元素int[] newArr = new int[arr.length + 1];// 将原数组前半部分复制到新数组中for (int i = 0; i < index; i++) {newArr[i] = arr[i];}// 插入新元素newArr[index] = value;// 将原数组后半部分复制到新数组中for (int i = index; i < arr.length; i++) {newArr[i + 1] = arr[i];}// 更新原数组for (int i = 0; i < arr.length; i++) {arr[i] = newArr[i];}}// 删除元素public static void deleteElement(int[] arr, int index) {if (index < 0 || index >= arr.length) {System.out.println("删除位置无效。");return;}// 创建一个新数组,比原数组少一个元素int[] newArr = new int[arr.length - 1];// 将原数组前半部分复制到新数组中for (int i = 0; i < index; i++) {newArr[i] = arr[i];}// 将原数组后半部分复制到新数组中for (int i = index + 1; i < arr.length; i++) {newArr[i - 1] = arr[i];}// 更新原数组for (int i = 0; i < arr.length - 1; i++) {arr[i] = newArr[i];}}// 查找元素public static int searchElement(int[] arr, int value) {for (int i = 0; i < arr.length; i++) {if (arr[i] == value) {return i; // 找到元素并返回索引}}return -1; // 元素不在数组中}
}

当进行插入、删除和查找操作时,我们需要综合考虑时间复杂度和空间复杂度。在数组中执行这些操作时,它们的性能表现如下:

1. 插入操作:

  • 时间复杂度: 对于数组的插入操作,最好的情况是在末尾插入,时间复杂度为O(1)。这是因为只需要在数组的末尾追加元素,不需要移动其他元素。但如果要在中间或开头插入元素,则需要将插入位置之后的元素向后移动,平均时间复杂度为O(n),其中n是数组的大小。

  • 空间复杂度: 插入操作的空间复杂度通常很低,仅包括新插入的元素所占用的空间。

示例代码 - 插入操作(数组):

public class ArrayExample {public static void main(String[] args) {int[] arr = {10, 20, 30, 40, 50};int insertValue = 60;int insertIndex = 2; // 在索引2处插入元素insertElement(arr, insertValue, insertIndex);}// 插入元素public static void insertElement(int[] arr, int value, int index) {if (index < 0 || index > arr.length) {System.out.println("插入位置无效。");return;}// 创建一个新数组,比原数组多一个元素int[] newArr = new int[arr.length + 1];// 将原数组前半部分复制到新数组中for (int i = 0; i < index; i++) {newArr[i] = arr[i];}// 插入新元素newArr[index] = value;// 将原数组后半部分复制到新数组中for (int i = index; i < arr.length; i++) {newArr[i + 1] = arr[i];}// 更新原数组for (int i = 0; i < arr.length; i++) {arr[i] = newArr[i];}}
}

2. 删除操作:

  • 时间复杂度: 删除操作的时间复杂度与插入类似,最好的情况是删除末尾元素,时间复杂度为O(1)。但如果要删除中间或开头的元素,则需要将删除位置之后的元素向前移动,平均时间复杂度为O(n),其中n是数组的大小。

  • 空间复杂度: 删除操作的空间复杂度通常很低,仅包括被删除元素的空间。

示例代码 - 删除操作(数组):

public class ArrayExample {public static void main(String[] args) {int[] arr = {10, 20, 30, 40, 50};int deleteIndex = 2; // 删除索引2处的元素deleteElement(arr, deleteIndex);}// 删除元素public static void deleteElement(int[] arr, int index) {if (index < 0 || index >= arr.length) {System.out.println("删除位置无效。");return;}// 创建一个新数组,比原数组少一个元素int[] newArr = new int[arr.length - 1];// 将原数组前半部分复制到新数组中for (int i = 0; i < index; i++) {newArr[i] = arr[i];}// 将原数组后半部分复制到新数组中for (int i = index + 1; i < arr.length; i++) {newArr[i - 1] = arr[i];}// 更新原数组for (int i = 0; i < arr.length - 1; i++) {arr[i] = newArr[i];}}
}

3. 查找操作:

  • 时间复杂度: 在数组中查找操作通常需要线性搜索,时间复杂度为O(n),其中n是数组的大小。如果数组是有序的,可以使用二分查找,时间复杂度为O(log n)。

  • 空间复杂度: 查找操作的空间复杂度通常很低,仅包括存储查找结果所需的空间。

示例代码 - 查找操作(数组):

public class ArrayExample {public static void main(String[] args) {int[] arr = {10, 20, 30, 40, 50};int searchValue = 30;int searchIndex = searchElement(arr, searchValue);if (searchIndex != -1) {System.out.println("元素 " + searchValue + " 在数组中的索引位置为 " + searchIndex);} else {System.out.println("元素 " + searchValue + " 不在数组中。");}}// 线性查找元素public static int searchElement(int[] arr, int value) {for (int i = 0; i < arr.length; i++) {if (arr[i] == value) {return i; // 找到并返回元素的索引}}return -1; // 元素不在数组中}
}

总结:

  • 数组在插入和删除操作中的性能通常受到插入或删除位置和数组大小的影响。查找操作的性能取决于数组是否有序。
  • 在选择数据结构和算法时,需要根据特定的需求和性能要求来做出决策。不同的数据结构和算法适用于不同的情况。

结语

下一章我们将继续探讨数组的应用扩展,包括 HashMapHashMapConcurrentHashTableHashSetLinkedHashMap 。这些数据结构在特定的应用场景中发挥了重要作用,它们具有不同的特性和性能特点,我将详细介绍它们的使用方法、优势以及适用的情况。如果您在这些内容中发现任何不准确或需要进一步说明的地方,欢迎提出,我将尽力提供准确和有用的信息。让我们共同学习,共同进步。

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

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

相关文章

@ControllerAdvice和@RestControllerAdivice的区别

在使用Spring框架时&#xff0c;我们经常会遇到需要处理异常的情况。而ControllerAdvice和RestControllerAdvice就是两种处理异常的方式。虽然它们的名字看起来很相似&#xff0c;但实际上有一些区别。 ControllerAdvice是用来处理Controller层抛出的异常的。当Controller层抛…

Article Forge:AI写作文章内容生成器

【产品介绍】 名称 Article Forge 成立/上线时间 2022年 具体描述 Article Forge是一款基于人工智能和深度学习的AI写作文章内容生成器&#xff0c;可以自动写出1500字的文章无论是产品描述&#xff0c;还是整篇博客文章&#xff0c;Article Forge都能在一…

堆与栈的区别

OVERVIEW 栈与堆的区别一、程序内存分区中的堆与栈1.栈2.堆3.堆&栈 二、数据结构中的堆与栈1.栈2.堆 三、堆的深入1.堆插入2.堆删除&#xff1a;3.堆建立&#xff1a;4.堆排序&#xff1a;5.堆实现优先队列&#xff1a;6.堆与栈的相关练习 栈与堆的区别 自整理&#xff0c;…

Stable Diffusion代码简介

Stable Diffusion是一个开源的实时数据流处理引擎&#xff0c;用于处理流式数据。其web UI提供了一个可视化界面来展示数据流的处理过程。 以下是Stable Diffusion web UI的详细代码说明&#xff1a; 1. 界面设计 Stable Diffusion web UI使用React框架进行开发&#xff0c;…

竞赛 基于机器视觉的车道线检测

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

video 视频编解码一些debug方法

文章目录 一、通过命令去获取一些数据1.2 确定我们xml配置文件: 二、查看我们芯片支持的编码能力三、通过log去获取信息 这个文章的主要内容是为了后期性能方面的debug, 设计到前期的bringup则没有 一、通过命令去获取一些数据 获取媒体相关的参数&#xff1a; # getprop |…

Thinkphp6 配置并使用redis图文详解 小皮面板

这篇文章主要介绍了Thinkphp6 配置并使用redis的方法,结合实例形式详细分析了Redis的安装、配置以及thinkphp6操作Redis的基本技巧,需要的朋友可以参考下 一、安装redis ThinkPHP内置支持的缓存类型包括file、memcache、wincache、sqlite。ThinkPHP默认使用自带的采用think\Ca…

SpringMVC之自定义注解

目录 一.什么是Java注解 1.简介 2.注解的分类 3.JDK元注解 二.自定义注解 1.自定义注解的分类 1.1.标记Annotation: 1.2.元数据Annotation: 2.如何使用自定义注解 3.案例演示 3.1 获取类、方法及属性上的注解值 3.2Inherited 的使用 3.3获取类属性上的注解属性值 3.…

springboot整合mybatis

一、项目结构展示 二、开始整合 1、引入pom依赖 进入Maven中央仓库选择自己所需要的依赖&#xff0c;maven仓库地址&#xff1a;Maven Central 完整Maven依赖如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"h…

markdown工具Atom预览与插件安装

​atom是以命令行作为插件选项的入口 打开命令输入框 Windows: ctrl shift p Mac: command shift p 输入命令安装 输入 markdown preview toggle &#xff0c;可以偷懒只输入mdpt(模糊匹配) 按enter键即可看到预览&#xff0c;如图&#xff0c;左边编辑&#xff0c;右…

Vue中的过滤器 Filters

过滤器 Filters 过滤器一般用于格式化文本内容&#xff0c;通常可以在两个地方使用&#xff0c;主要是模板语法、以及 v-bind 表达式中。例如我想对展示的文本进行一些特殊处理&#xff0c;将金额进行四舍五入后再展示。选项 filters 内可以编写多个自定义过滤器。 用法&…

LightDB 23.3 通过GUC参数控制commit fetch

背景 commit游标提交之后&#xff0c;可以继续使用fetch进行结果集的操作。commit和fetch结合使用功能开发时不考虑分布式。后续&#xff0c;又对分布式进行了测试&#xff0c;发现持有portal后&#xff0c;代码中会对querydesc进行非空判断。当querydesc为空时&#xff0c;Li…

工业交换机常见的硬件故障有哪些?

工业交换机常见的硬件故障主要是由于受到供电电源、室内温度、室内湿度、电磁干扰、静电等机房环境的影响&#xff0c;造成工业交换机电源、背板、模块、端口等部件出现故障。具体可以分为以下几类。 1.电力供应故障&#xff1a; 由于外部供电不稳定、电源线路老化或雷击等原因…

LiveNVR监控流媒体Onvif/RTSP功能-支持海康摄像头海康NVR通过EHOME协议ISUP协议接入分发视频流或是转GB28181

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

亚马逊封买家账号的原因有哪些

亚马逊可能封锁买家账号的原因有多种&#xff0c;主要是出于保护市场和维护平台秩序的考虑。以下是一些可能导致亚马逊封锁买家账号的常见原因&#xff1a; 1、涉及违规行为&#xff1a;如果买家违反了亚马逊的使用政策&#xff0c;如发表虚假评价、滥用退货政策、欺诈或盗窃等…

归并排序三种常见写法

算法思路 归并排序是一种分治算法&#xff1a;首先将数组分成两半&#xff0c;然后对每一半进行归并排序&#xff0c;最后将两个有序的子数组合并&#xff0c;以得到最终的排序数组。为了简洁下面代码中会调用 STL 的 i n p l a c e _ m e r g e inplace\_merge inplace_merg…

【视觉SLAM入门】7.3.后端优化 基于KF/EKF和基于BA图优化的后端,推导及举例分析

"时间倾诉我的故事" 1. 理论推导2. 主流解法3. 用EKF估计状态3.1. 基于EKF代表解法的感悟 4. 用BA法估计状态4.1 构建最小二乘问题4.2 求解BA推导4.3 H的稀疏结构4.4 根据H稀疏性求解4.5 鲁棒核函数4.6 编程注意 5.总结 引入&#xff1a; 前端里程计能给出一个短时间…

markdown学习笔记

markdown学习笔记 1.文字&#xff08;依靠HTML&#xff09; 1.1文字缩进-空格转义符 单字符空&#xff1a;&emsp; 半字符空&#xff1a;&ensp;1.2文字对齐 「居中&#xff1a;」<center> 居中 </center> or <p align"center"> 居中 …

吃瓜教程第一二章学习记录

当大多数人听到 "机器学习 "时&#xff0c;他们会联想到机器人&#xff1a;一个可靠的管家或一个致命的终结者&#xff0c;这取决于你问谁。但是&#xff0c;机器学习并不只是未来主义的幻想&#xff0c;它已经存在了。事实上&#xff0c;在一些特殊的应用中&#xf…

Mysql---第四篇

系列文章目录 文章目录 系列文章目录一、关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?二、事务的基本特性和隔离级别一、关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过? 在业务系统中,除了使用主键进行的查询,其他的都…