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

C#中的Array数组,List集合和ArrayList集合--07

目录

一.Array数组概念的简单理解

1.数组的初始化

2.数组的长度

3.数组的克隆和复制

4.数组的清空

5.数组的查找

6.数组的逆转

7.数组的拓展和缩减

 8.数组的比较

9.数组的合并

10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等

二.Array数组进阶

1.二维数组

2.多维数组

 3.交错数组

4.隐式类型数组

三.List集合

1.基本概念

2.声明和初始化

 3.List集合中的常用方法

四.ArrayList集合

1.基本概念:

2.声明和初始化

3.ArrayList中的常用方法

五.总结

Array(数组)

List

ArrayList

三者之间的异同


一.Array数组概念的简单理解

1.数组的初始化

在C#中,可以在声明数组时同时进行初始化.

数组是一种基本的数据结构,用于存储固定大小的同类型元素集合

创建数组的一般格式:  数组类型[] 数组名称=new数组类型[数组长度]

以下是常见的几种方式

代码示例:

// 一维数组初始化   
int[] numbers = new int[] { 1, 2, 3, 4, 5 };// 简化的语法   
int[] numbers2 = { 1, 2, 3, 4, 5 };// 多维数组初始化   
int[,] matrix = new int[,] { { 1, 2 }, { 3, 4 } };// 交错数组初始化   
int[][] jaggedArray = new int[][]    
{new int[] { 1, 2 },new int[] { 3, 4, 5 }   
};

在完成数组的创建后 ,可以根据数组的索引进行初始化,赋值,访问等操作

注意:数组的索引从0作为起始,以数组的长度减一作为终止

假设一个数组的长度为5

//假设一个数组的长度为5
//int[] arr = new int[5] { 1, 2, 3, 4, 5 };
int[] arr = { 1, 2, 3, 4, 5 };
//数组元素: 1 2 3 4 5
//数组索引: 0 1 2 3 4
Console.WriteLine(arr.Length); //通过Length属性获取数组的长度
Console.WriteLine(arr[3]); // 输出索引为3的元素(输出4)
arr[3]= 100; //修改数组索引为3的元素为100
//数组元素: 1 2 3 100 5
//数组索引: 0 1 2 3   4
Console.WriteLine(arr[3]);// 输出索引为3的元素(输出100)
//Console.WriteLine(arr[5]);  //索引越界,如果强行进行编译,会报如下错误:
//Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.

2.数组的长度

在数组中,Length属性可以获取数组的长度(即数组的元素)

代码示例:

int[] numbers = { 1, 2, 3, 4, 5 };   
int length = numbers.Length; // length = 5

3.数组的克隆和复制

在数组中,可以使用Clone方法和Array.Copy方法来复制数组

代码示例:

int[] original = { 1, 2, 3, 4, 5 };// 使用 Clone 方法   
int[] clone = (int[])original.Clone();// 使用 Array.Copy 方法   
int[] copy = new int[original.Length];   
Array.Copy(original, copy, original.Length);

4.数组的清空

Array.Clear方法可以将数组中所有的元素设置为默认值(比如int类型的默认值是0)

代码示例:

int[] numbers = { 1, 2, 3, 4, 5 };
Array.Clear(numbers, 0, numbers.Length); // 数组中的所有元素将变为0

5.数组的查找

在C#的数组中可以使用Array.IndexOf和Array.Find等方法去查找特定的元素

代码示例:

int[] numbers = { 1, 2, 3, 4, 5 };// 使用 Array.IndexOf   
int index = Array.IndexOf(numbers, 3); // index = 2// 使用 Array.Find
int number = Array.Find(numbers, n => n > 3); // number = 4   

6.数组的逆转

Array.Reverse方法可以翻转数组中的元素顺序

代码示例:

int[] numbers = { 1, 2, 3, 4, 5 };
Array.Reverse(numbers); // numbers = { 5, 4, 3, 2, 1 }   

7.数组的拓展和缩减

在C#中一般来说Array数组的大小是在创建时固定的,一旦定义了数组就不能直接更改.

但是可以去使用Array.Resize方法去调整数组的大小

代码示例:

int[] numbers = { 1, 2, 3, 4, 5 };   
Array.Resize(ref numbers, 3); // numbers = { 1, 2, 3 }
Array.Resize(ref numbers, 7); // numbers = { 1, 2, 3, 0, 0, 0, 0 }   
//需要注意的是当你增加数组大小时,新增加的位置将被初始化为该类型的默认值(对于数值类型是0,对于引用类型是null)。当你减少数组大小时,超出新长度的元素将被丢弃。

 8.数组的比较

为了比较两个数组是否完全相同,可以通过遍历数组元素逐个比较,或者使用SequenceEqual方法来比较两个数组是否相同.

代码示例:

int[] array1 = { 1, 2, 3 };   
int[] array2 = { 1, 2, 3 };// 使用 SequenceEqual 方法(需要 System.Linq 命名空间)   
bool areEqual = array1.SequenceEqual(array2); // areEqual = true   

9.数组的合并

在C#中,我们可以去使用Concat方法去合并两个数组\

代码示例:

int[] array1 = { 1, 2, 3 };   
int[] array2 = { 4, 5, 6 };// 使用 Concat 方法(需要 System.Linq 命名空间)
int[] merged = array1.Concat(array2).ToArray(); // merged = { 1, 2, 3, 4, 5, 6 }   

10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等

代码示例:

int[] numbers = { 3, 1, 4, 5, 2 };// 使用 Array.Sort 方法进行排序
Array.Sort(numbers); // numbers = { 1, 2, 3, 4, 5 }// 使用 Array.BinarySearch 方法进行二分查找(前提是数组已排序)
int index = Array.BinarySearch(numbers, 4); // index = 3

二.Array数组进阶

1.二维数组

二维数组可以看作是数组的数组,即每个元素都是一个数组.例如,一个2行3列的二维数组可以看作是一个包含2个数组的数组,每个数组包含3个元素

二维数组也能够将其理解为多维数组的一种特殊形式,可以看做一个矩阵或者表格,具有行和列

// 声明一个二维数组   
int[,] matrix = new int[2, 3]; // 2行3列// 初始化一个二维数组   
int[,] initializedMatrix = new int[,]   
{{ 1, 2, 3 },{ 4, 5, 6 }
};// 访问二维数组的元素   
int element = initializedMatrix[1, 2]; // 获取第二行第三列的元素,值为6

二维数组的特点:

  • 二维数组是以矩阵形式存储的
  • 元素通过两个索引访问,第一个索引表示行,第二个索引表示列
  • 在内存中是以行优先顺序存储的

2.多维数组

多维数组通常指代维度大于二的数组,可以用于表示更加复杂的数据结构

下面使用三维数组来举例

// 声明一个三维数组   
int[,,] threeDimensional = new int[2, 3, 4]; // 2个2D数组,每个3行4列// 初始化一个三维数组   
int[,,] initializedThreeDimensional = new int[,,]   
{{{ 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 element = initializedThreeDimensional[1, 2, 3]; // 获取第二个2D数组第三行第四列的元素,值为24

多维数组的特点:

  • 支持多个维度,每个维度可以有不同的大小
  • 通过多个索引访问元素,每个索引对应一个维度。

 3.交错数组

交错数组(或锯齿数组)是数组的数组,其中每个子数组的长度可以不同.

代码示例:

// 声明一个交错数组   
int[][] jaggedArray = new int[3][]; // 3个子数组// 为每个子数组分配不同的长度   
jaggedArray[0] = new int[2]; // 第一个子数组有2个元素   
jaggedArray[1] = new int[3]; // 第二个子数组有3个元素   
jaggedArray[2] = new int[4]; // 第三个子数组有4个元素// 初始化交错数组   
int[][] initializedJaggedArray = new int[][]   
{new int[] { 1, 2 },new int[] { 3, 4, 5 },new int[] { 6, 7, 8, 9 }   
};// 访问交错数组的元素   
int element = initializedJaggedArray[1][2]; // 获取第二个子数组的第三个元素,值为5

交错数组的特点:

  • 每个子数组可以有不同的长度
  • 在内存中,子数组是独立的数组,可以分布在不同的位置

4.隐式类型数组

隐式类型化数组利用C#的类型推断功能,由编译器根据数组的初始值推断数组的类型.

代码示例:

// 使用隐式类型化数组   
var numbers = new[] { 1, 2, 3, 4, 5 };// 编译器推断出 numbers 是一个 int[] 类型的数组// 对于复杂类型   
var complexArray = new[]   
{new { Name = "Alice", Age = 30 },new { Name = "Bob", Age = 25 }
};// 编译器推断出 complexArray 是一个匿名类型数组

隐式类型数组的特点:

  • 编译器根据初始值推断数组的类型,要求所有初始值的类型必须兼容
  • 可以提高代码的可读性,尤其是在复杂类型的情况下

三.List集合

在C#中,List<T>是一个非常常用的泛型集合,它提供了动态数组的功能.与普通数组相比,List<T>具有更灵活的大小调整能力,并且提供了许多方便的方法来操作集合中的元素.以下是关于List<T>的详细信息:

1.基本概念

  • 动态大小:List<T>可以根据需要动态调整其大小.你可以添加或移除元素,而不需要手动管理内存.
  • 泛型支持:List<T>是一个泛型集合,这意味着你可以指定元素的类型,这提供了类型安全性和性能优化.

2.声明和初始化

代码示例:

// 声明一个 List<int>   
List<int> numbers = new List<int>();// 初始化一个 List<string> 并添加元素   
List<string> names = new List<string> { "Alice", "Bob", "Charlie" };

 3.List集合中的常用方法

  1. 添加元素
    numbers.Add(10); // 添加单个元素
    numbers.AddRange(new int[] { 20, 30, 40 }); // 添加多个元素
    
  2. 插入元素
    numbers.Insert(1, 15); // 在索引1处插入元素15
    
  3. 删除元素
    numbers.Remove(10); // 移除值为10的元素
    numbers.RemoveAt(0); // 移除索引0处的元素
    numbers.RemoveRange(0, 2); // 移除从索引0开始的两个元素
    
  4. 访问元素
    int firstNumber = numbers[0]; // 访问第一个元素
    
  5. 查找元素
    int index = numbers.IndexOf(30); // 查找值为30的元素的索引
    bool contains = numbers.Contains(20); // 检查是否包含值为20的元素
    
  6. 排序
    numbers.Sort(); // 对列表进行升序排序
    numbers.Reverse(); // 反转列表顺序
    
  7. 清空列表
    numbers.Clear(); // 移除所有元素
    

List泛型集合的特点:

  • 自动扩容:List<T>内部实现为一个数组,当需要增加容量时,会自动创建一个更大的数组,并将旧数组中的元素复制到新数组中.这个过程可能会影响性能,尤其是在频繁添加大量元素时
  • 索引访问:与数组类似,List<T>支持通过索引访问元素,访问速度很快
  • 线程安全:List<T>不是线程安全的.在多线程环境中使用时,需要手动实现同步

List集合的应用场景 :

  • 频繁更改大小的集合:List<T>非常适合需要频繁添加,删除或调整大小的集合
  • 需要类型安全的集合:由于List<T>是泛型的,它可以确保集合中的所有元素都是同一类型

四.ArrayList集合

ArrayList集合:

ArrayList是 C# 中一种非泛型集合类,用于存储元素列表.它在 .NET Framework 1.0 引入,适用于早期不支持泛型的场景.尽管在现代开发中推荐使用泛型集合如List<T>,但了解 ArrayList仍然有助于理解 C# 集合的演变和处理非泛型数据的方式

1.基本概念:

  • 非泛型:ArrayList可以存储任何类型的对象,因为它存储的是object类型.这意味着你可以在同一个 ArrayList中存储不同类型的数据
  • 动态大小:与List<T>类似,ArrayList可以根据需要自动调整其大小。

2.声明和初始化

代码示例:

// 声明一个 ArrayList   
ArrayList arrayList = new ArrayList();// 初始化并添加元素   
ArrayList mixedList = new ArrayList() { 1, "hello", 3.14, true };

3.ArrayList中的常用方法

  1. 添加元素
    arrayList.Add(10); // 添加单个元素
    arrayList.AddRange(new object[] { "world", 20.5 }); // 添加多个元素
    
  2. 插入元素
    arrayList.Insert(1, "inserted"); // 在索引1处插入元素
    
  3. 删除元素
    arrayList.Remove(10); // 移除指定值的元素
    arrayList.RemoveAt(0); // 移除索引0处的元素
    arrayList.RemoveRange(0, 2); // 移除从索引0开始的两个元素
    
  4. 访问元素
    var firstElement = arrayList[0]; // 访问第一个元素
    
  5. 查找元素
    int index = arrayList.IndexOf("hello"); // 查找元素的索引
    bool contains = arrayList.Contains(3.14); // 检查是否包含某个元素
    
  6. 排序
    arrayList.Sort(); // 对列表进行排序
    
  7. 清空列表
    arrayList.Clear(); // 移除所有元素
    

性能和使用注意:

  • 装箱和拆箱:由于ArrayList存储的是object类型,对于值类型(如int和double),会发生装箱和拆箱操作,可能影响性能
  • 类型安全性:ArrayList不提供编译时类型检查,可能导致运行时错误.例如,尝试将不兼容的类型转换为特定类型时
  • 线程安全:ArrayList不是线程安全的.在多线程环境中使用时,需要手动实现同步

应用场景:

  • 早期代码:在泛型引入之前的旧代码中经常使用ArrayList
  • 需要存储不同类型的集合:在某些情况下,可能需要在同一集合中存储不同类型的对象

五.总结

Array(数组)

特点

固定大小:数组一旦创建,其大小是固定的,不能动态调整。

类型安全:数组是强类型的,定义时需要指定元素类型,所有元素必须是同一类型。

高效访问:由于数组在内存中是连续存储的,访问速度非常快。

优点

性能高:由于连续内存分配和类型安全,数组的访问和遍历速度较快。

简单直接:适合用于已知大小和类型的集合。

缺点

大小固定:不能动态调整大小,需要预先定义。

功能有限:没有提供丰富的集合操作方法。

用法:

int[] numbers = new int[5]; // 创建一个长度为5的整数数组   
numbers[0] = 10; // 设置元素   
int first = numbers[0]; // 访问元素

List<T>

特点

动态大小:List<T>可以根据需要动态调整大小。

泛型支持:提供类型安全,所有元素必须是同一类型。

丰富的方法:提供了许多用于操作集合的内置方法,如添加、插入、删除、排序等。

优点

灵活性高:能够处理动态变化的集合大小。

类型安全:通过泛型提供编译时类型检查。

缺点

性能开销:在需要扩容时,会有一定的性能开销,因为需要分配新数组并复制元素。

用法:

List<int> numbers = new List<int>();   
numbers.Add(10); // 添加元素   
int first = numbers[0]; // 访问元素

ArrayList

特点

动态大小:ArrayList也可以根据需要动态调整大小。

非泛型:可以存储不同类型的对象,因为它存储的是object类型。

较旧的集合类型:在 .NET 1.0 时代引入,在泛型出现之前广泛使用。

优点

灵活性高:可以存储不同类型的对象。

动态调整大小:能够处理动态变化的集合大小。

缺点

类型不安全:没有编译时类型检查,可能导致运行时错误。

性能问题:由于装箱和拆箱操作,性能可能较低。

用法:

ArrayList arrayList = new ArrayList();   
arrayList.Add(10); // 添加元素   
arrayList.Add("string"); // 添加不同类型的元素   
object first = arrayList[0]; // 访问元素

三者之间的异同

  • 类型安全性:Array和List<T>提供类型安全,而ArrayList不提供。
  • 大小调整:Array大小固定,List<T>和 ArrayList大小可动态调整。
  • 性能:Array通常性能最好,List<T>次之,ArrayList由于装箱和拆箱可能性能最差。
  • 使用场景:Array适合固定大小的集合,List<T>适合动态大小且类型一致的集合,ArrayList适合需要存储不同类型对象的旧代码。

相关文章:

C#中的Array数组,List集合和ArrayList集合--07

目录 一.Array数组概念的简单理解 1.数组的初始化 2.数组的长度 3.数组的克隆和复制 4.数组的清空 5.数组的查找 6.数组的逆转 7.数组的拓展和缩减 8.数组的比较 9.数组的合并 10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等 二.Array数组进阶 1.二…...

基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用

在使用 PySide6 进行开发时&#xff0c;管理应用程序的资源&#xff08;如图标、图片、字体、样式表、音视频等&#xff09;是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc&#xff0c;它能够将资源文件&#xff08;.qrc&#xff09;编译成 Python 模块&#xff0c;然后…...

硬件实用技巧:TPS54331DR横杠标识识别1引脚

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/145116969 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

《C++11》nullptr介绍:从NULL说起

在C11之前&#xff0c;我们通常使用NULL来表示空指针。然而&#xff0c;NULL在C中有一些问题和限制&#xff0c;这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中&#xff0c;NULL实际上是一个整数0&#xff0c;而不是一个真正的…...

自然语言处理基础:全面概述

自然语言处理基础&#xff1a;全面概述 什么是NLP及其重要性、NLP的核心组件、NLU与NLG、NLU与NLG的集成、NLP的挑战以及NLP的未来 自然语言处理&#xff08;NLP&#xff09;是人工智能&#xff08;AI&#xff09;中最引人入胜且具有影响力的领域之一。它驱动着我们日常使用的…...

网络安全的几种攻击方法

攻击方法 挂马: 就是在别人的网站文件里面放入网页木马或者是将代码潜入到对方正常的网页文件里&#xff0c;以使浏览者中马。 挖洞: 指漏洞挖掘。 加壳: 就是利用特殊的算法&#xff0c;将EXE可执行程序或者DLL动态连接库文件的编码进行改变&#xff08;比如实现压缩、加密&a…...

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…...

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法&#xff1a; 第一步&#xff1a;安装distutils&#xff0c;在CMD命令行输入&#xff1a; python -m ensurepip --default-pip第二步&#xff1a;检查和安装setuptools和wheel&#xff1a; python -m pip install --upgrade …...

C++ QT 自绘表盘

文章目录 效果图代码 效果图 代码 代码没什么好说的&#xff0c;直接上源码.h #pragma once#include <QWidget> #include <QPainter> #include <QResizeEvent> #include <QtMath> #include <QCoreApplication>class DialPlateWidget : public …...

数据科学与数据工程:两者的区别与交集

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

MAC AndroidStudio模拟器无网络

先确认PC端是正常访问网络的&#xff1b; 模拟器端修改Wifi设置&#xff1a;设置 - 网络和互联网 - WALN设置 按照上图修改&#xff1b; IP设置&#xff1a;从DHCP修改为静态&#xff0c;IP地址&#xff1a;10.0.2.16 &#xff0c;网关&#xff1a;10.0.2.2 &#xff0c; DNS…...

PHP语言的多线程编程

PHP语言的多线程编程 引言 在现代Web开发中&#xff0c;PHP以其简洁和易用性广受欢迎。它常用于构建动态网站和应用程序。然而&#xff0c;PHP本身是单线程的&#xff0c;这意味着它在处理多个任务时可能会受到性能限制。随着互联网的发展&#xff0c;对高并发、高可用性和实…...

当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限

在自动化控制技术日新月异的当下&#xff0c;Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议&#xff0c;而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…...

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年&#xff0c;大模型技术已经普及并逐步渗透到各行各业&#xff0c;2025年注定是大模型应用井喷式发展的一年&#xff0c;AI在快速发展的同时&#xff0c;其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载&#xff1a;600多…...

OpenCV相机标定与3D重建(54)解决透视 n 点问题(Perspective-n-Point, PnP)函数solvePnP()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据3D-2D点对应关系找到物体的姿态。 cv::solvePnP 是 OpenCV 库中的一个函数&#xff0c;用于解决透视 n 点问题&#xff08;Perspective-n-Po…...

Chatper 4: Implementing a GPT model from Scratch To Generate Text

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture4.2 Normalizing activations with layer normalization4.3 Implementing a feed forward network with GELU activations4.4 Adding shortcut connections4.5 Connecting at…...

spring-mvc源码分析v3.3.0

分析下springboot内嵌tomcat启动流程&#xff0c;即springboot-mvc <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.3.0</version> </dependency>环境…...

Rust实现智能助手 - 项目初始化

文章目录 前言环境准备依赖代码运行使用最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近准备花一些时间来使用Rust语言实现一个智能助手&#xff0c;希望能够帮助到你。 环境准备 安装Rust语言环境&#xff0c;你可以从官网下载安装包安装。安装Ollama&#xff0c;…...

sparkSQL练习

1.前期准备 &#xff08;1&#xff09;建议先把这两篇文章都看一下吧&#xff0c;然后把这个项目也搞下来 &#xff08;2&#xff09;看看这个任务 &#xff08;3&#xff09;score.txt student_id,course_code,score 108,3-105,99 105,3-105,88 107,3-105,77 105,3-245,87 1…...

QT跨平台应用程序开发框架(2)—— 初识QT

目录 一&#xff0c;创建helloworld 1.1 通过图形化 1.2 通过代码 1.3 通过编辑框 1.4 使用按钮 二&#xff0c;对象树 2.1 关于对象树 2.2 演示释放流程 三&#xff0c;乱码问题 3.1 为什么会有乱码问题 3.2 解决乱码问题 四&#xff0c;认识Qt坐标系 五&#xf…...

短视频矩阵系统源码新发布技术方案有那几种?

短视频矩阵运营在平台政策频繁更迭的浪潮中&#xff0c;已成为内容分发的核心战场。行业领先者如筷子科技、云罗抖去推、超级编导等平台&#xff0c;其稳定高效的代发能力背后&#xff0c;离不开前沿技术方案的强力支撑。本文将深入剖析当前主流的六大短视频矩阵系统代发解决方…...

Elasticsearch + Milvus 构建高效知识库问答系统《一》

&#x1f50d; Elasticsearch Milvus 构建高效知识库问答系统&#xff08;RAG 技术实战&#xff09; &#x1f4cc; 目录 背景介绍Elasticsearch 在知识库检索中的作用Milvus 在知识库检索中的作用混合检索&#xff1a;Elasticsearch Milvus完整代码实现部署建议与优化方向…...

Reactor和Proactor

reactor的重要组件包括&#xff1a;Event事件、Reactor反应堆、Demultiplex事件分发器、Eventhandler事件处理器。...

ABP VNext 与 Neo4j:构建基于图数据库的高效关系查询

ABP VNext 与 Neo4j&#xff1a;构建基于图数据库的高效关系查询 &#x1f680; 在社交网络、权限图谱、推荐系统等应用场景中&#xff0c;关系链深度和复杂度远超传统关系型数据库的表达能力。本文基于 ABP VNext 框架&#xff0c;集成 Neo4j 图数据库&#xff0c;构建一套高…...

Druid连接池实现自定义数据库密码加解密功能详解

Druid连接池实现自定义数据库密码加解密功能详解 在企业级应用开发中&#xff0c;数据库密码的明文存储是一个显著的安全隐患。Druid作为阿里巴巴开源的高性能数据库连接池组件&#xff0c;提供了灵活的密码加密与解密功能&#xff0c;允许开发者通过自定义逻辑实现数据库密码…...

文件上传漏洞深度解析:检测与绕过技术矩阵

文件上传漏洞深度解析&#xff1a;检测与绕过技术矩阵 引言&#xff1a;无处不在的文件上传风险 在当今的Web应用生态系统中&#xff0c;文件上传功能几乎无处不在。从社交媒体分享图片到企业文档管理系统&#xff0c;用户上传文件已成为现代Web应用的核心功能之一。然而&…...

RetroMAE 预训练任务

RetroMAE 预训练任务的具体步骤&#xff0c;围绕 编码&#xff08;Encoding&#xff09;、解码&#xff08;Decoding&#xff09;、增强解码&#xff08;Enhanced decoding&#xff09; 三个核心阶段展开&#xff0c;以下结合图中流程拆解&#xff1a; 一、阶段 A&#xff1a;…...

分词算法BBPE详解和Qwen的应用

一、TL&#xff1b;DR BPE有什么问题&#xff1a;依旧会遇到OOV问题&#xff0c;并且中文、日文这些大词汇表模型容易出现训练中未出现过的字符Byte-level BPE怎么解决&#xff1a;与BPE一样是高频字节进行合并&#xff0c;但BBPE是以UTF-8编码UTF-8编码字节序列而非字符序列B…...

HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖

##鸿蒙核心技术##运动开发##Core Speech Kit&#xff08;基础语音服务&#xff09;# 前言 在运动类应用中&#xff0c;语音播报功能不仅可以提升用户体验&#xff0c;还能让运动过程更加生动有趣。想象一下&#xff0c;当你准备开始运动时&#xff0c;一个温暖的声音提醒你“…...

vscode自定义主题语法及流程

vscode c/c 主题 DIY 启用自己的主题(最后步骤) 重启生效 手把手教你制作 在C:\Users\jlh.vscode\extensions下自己创建一个文件夹 里面有两个文件一个文件夹 package.json: {"name":"theme-jlh","displayName":"%displayName%&qu…...