C#高级编程笔记--字符串和正则表达式

news2024/10/8 8:37:35

本章的主要内容如下:

  •         创建字符串
  •         格式化表达式
  •         正则表达式​​​​​​​

1.1   System.String类

System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作。由于这种数据类型非常重要,C#提供了它自己的关键字和相关的语法,以便于使用这个类来处理字符串。

使用运算符重载可以连接字符串

string message1 = "Hello";  //return "Hello"

message1 += ", There";    // return "Hello, There "

string message2 = message1 + "!";     // return "Hello, There!"

C#还允许使用类似于索引器的语法来提取指定的字符:

char char4 = message[4];   // returns 'a'. Note the char is zero-indexed


这个类可以完成许多常见的任务,例如替换字符、删除空白和把字母变成大写形式等。可用的方法如表1-1所示。

1.1.1  创建字符串

如上所述,string类是一个功能非常强大的类,它执行许多很有用的方法。但是,string类存在一个问题:重复修改给定的字符串,效率会很低,它实际上是一个不可变的数据类型,一旦对字符串对象进行了初始化,该字符串对象就不能改变了。表面上修改字符串内容的方法和运算符实际上是创建一个新的字符串,如果必要,可以把旧字符串的内容复制到新字符串中。例如,下面的代码:

string greetingText = "Hello from all the guys at Wrox Press. ";

greetingText += "We do hope you enjoy this book as much as we enjoyed writing it.";

因为由于字符串的本质还是char数组,一旦初始化了也就代表数组的长度固定了,无法动态扩容,所以是一个不可变的数据类型。这里抛出一个问题:为什么字符串设计为不可变的数据类型?

为了解决这个问题,Microsoft提供了System.Text.StringBuilder类。StringBuilder不像String那样支持非常多的方法。在StringBuilder上可以进行的处理仅限于替换和添加或删除字符串中的文本。但是,它的工作方式非常高效。

在使用String类构造一个字符串时,要给它分配足够的内存来保存字符串,但StringBuilder通常分配的内存会比需要的更多。开发人员可以选择显式指定StringBuilder要分配多少内存,但如果没有显式指定,存储单元量在默认情况下就根据StringBuilder初始化时的字符串长度来确定。它有两个主要的属性:

●       Length指定字符串的实际长度;

●       Capacity是字符串占据存储单元的最大长度。

对字符串的修改就在赋予StringBuilder实例的存储单元中进行,这就大大提高了添加子字符串和替换单个字符的效率。删除或插入子字符串仍然效率低下,因为这需要移动随后的字符串。只有执行扩展字符串容量的操作,才需要给字符串分配新内存,才可能移动包含的整个字符串。在添加额外的容量时,从经验来看,StringBuilder如果检测到容量超出,且容量没有设置新值,就会使自己的容量翻倍。

注意:为了使用StringBuilder类,需要在代码中引用System.Text。一般,使用StringBuilder可以执行字符串的操作,String可以存储字符串或显示最终结果。

1.1.2  StringBuilder成员

StringBuilder的构造函数:

StringBuilder greetingBuilder =  new StringBuilder("HelloWorld. ", 150);

或者,可以只提供一个字符串:

StringBuilder sb = new StringBuilder("Hello");

或者用给定的容量创建一个空的StringBuilder:

StringBuilder sb = new StringBuilder(20);

除了前面介绍的Length 和 Capacity属性外,还有一个只读属性MaxCapacity,它表示对给定的StringBuilder实例的容量限制。在默认情况下,这由int.MaxValue给定(大约20亿,如前所述)。但在构造StringBuilder对象时,也可以把这个值设置为较低的值:

// This will both set initial capacity to 100, but the max will be 500.

StringBuilder sb = new StringBuilder(100, 500);

还可以随时显式地设置容量,但如果把这个值设置为低于字符串的当前长度,或者超出了最大容量,就会抛出一个异常:

StringBuilder sb = new StringBuilder("Hello");

sb.Capacity = 100;

主要的StringBuilder方法如表1-2所示。

注意:

AppendFormat()实际上会在调用Console.WriteLine()时调用,它负责确定所有像{0:D}的格式化表达式应使用什么表达式替代。下一节讨论这个问题。

不能把StringBuilder转换为String(隐式转换和显式转换都不行)。如果要把StringBuilder的内容输出为String,唯一的方式是使用ToString()方法。

前面介绍了StringBuilder类,说明了使用它提高性能的一些方式。注意,这个类并不总能提高性能。StringBuilder类基本上应在处理多个字符串时使用。但如果只是连接两个字符串,使用System.String会比较好。

1.2  字符串格式

C# 6引入了给字符串使用$前缀的字符串插值。下面的示例使用$前缀创建了字符串s2,这个前缀允许在花括号中包含占位符来引用代码的结果。{s1}是字符串中的一个占位符,编译器将变量s1的值放在字符串s2中.

string s1 = "world";

string s2 = $" hello, {s1} "

在现实中,这只是语法糖。对于带S前缀的字符串用。所以这段代码解读为:   

string s1 = "world";

string s2 = string.Format(" hello, {0} ",s1 )    

String.Format方法的第一个参数接受一个格式字符串,其中的占位符从0开始编号,其后是放入字符串空白处的参数。

新的字符串格式要方便得多,不需要编写那么多代码。不仅可以使用变量来填写字符串的空白处,还可以使用返回一个值的任何方法:

string s2 =$"Hello,(s1.ToUpper()}"; //string s2=String.Format("Hello,{0}",sl.ToUpper());

1. FormattableString

把字符串赋予FormattableString,就很容易得到翻译过来的插值字符串。插值字符串可以直接分配,因为 FormattableString比正常的字符串更适合匹配。这个类型定义了Format属性(返回得到的格式字符串)、 ArgumentCount属性和方法GetArgument(返回值):

intx=3,y=4;
Console.WriteLine(S"format:(s.Format}");
for(int i=0;i< s.ArgumentCount;i++)
Console.WriteLine($"argument (i}:(s.GetArgument(i)}");


//运行此代码段,输出结果如下:
format:The result of{0} +{l}is{2}
argument 0:3
argument 1:4
argument 2:7

注意:
类FormattableString在System名称空间中定义,但是需要.NET4.6。如果想在.NET旧版本中使用
FormattableString,可以自己创建这种类型,或使用NuGet包StringInterpolationBridge。

2. 给字符串插值使用其他区域值

插值字符串默认使用当前的区域值,这很容易改变。辅助方法Invariant把插值字符串改为使用不变的区域值,而不是当前的区域值。因为插值字符串可以分配给FormattableString类型,所以它们可以传递给这个方法。FormattableString定义了允许传递IFormatProvider的ToString方法。接口IFormatProvider由CultureInfo类实现。把 CultureInfo.InvariantCulture传递给IFormatProvider参数,就可把字符串改为使用不变的区域值:

private string Invariant(FormattableString s) => ToString(CultureInfo.InvariantCulture):

在下面的代码段中,Invariant方法用来把一个字符串传递给第二个WriteLine方法。WriteLine 的第一个调用使用当前的区域值,而第二个调用使用不变的区域值:

var day = new DateTime(2025,2,14);
Console.WriteLine($"{day:d}");
Console.WriteLine(Invariant($"{day:d}"));

如果有英语区域值设置,结果就如下所示。如果系统配置了另一个区域值,第一个结果就是不同的。在任何情况下,都会看到不变区域值的差异:

2/14/2025
02/14/2015

使用不变的区域值,不需要自己实现方法,而可以直接使用FormattableString 类的静态方法Invariant:

Console.WriteLine(FormattableString.Invariant($"(day:d}"));

3. 转义花括号

如果希望在插值字符串中包括花括号,可以使用两个花括号转义它们:

String S = "Hello";
Console.WriteLine($"{(s}} displays the value of s: {s}");

// 输出如下:
{s}displays thevalue of s:Hello

1.2.2日期时间和数字的格式

除了给占位符使用字符串格式之外,还可以根据数据类型使用特定的格式。下面先从日期开始。在占位符中,格式字符串跟在表达式的后面,用冒号隔开。下面所示的例子是用于DateTime类型的D和d格式:

var day=newDateTime(2025,2,14);
WriteLine($"{day:D}");
WriteLine($"(day:d}");
//  结果显示,用大写字母D表示长日期格式字符串,用小写字母d表示短日期字符串:
Friday, February 14, 2025
2/14/2025

根据所使用的大写或小写字符串,DateTime类型会得到不同的结果。根据系统的语言设置,输出可能不同。日期和时间是特定于语言的
DateTime类型支持很多不同的标准格式字符串,显示日期和时间的所有表示:例如,t表示短时间格式,T表示长时间格式,g和G显示日期和时间。这里不讨论所有其他选项,在MSDN文档的DateTime类型的ToString方法中,可以找到相关介绍。

这里抛出一个问题:如何定义自定义的日期格式字符串?

数字的格式字符串不区分大小写。下面看看n、e、x和c标准数字格式字符串:

inti=2477;
Console.WriteLine($"{i:n}{i:e}{i:x}{i:c}");
//输出:2,477.00 2.477000e+003 9ad $2,477.00

n格式字符串定义了一个数字格式,用组分隔符显示整数和小数。e表示使用指数表示法,x表示转换为十六进制,c显示货币:
对于数字的表示,还可以使用定制的格式字符事。#格式说明符是一个数字占位符,如果数字可用,就显示数字;如果数字不可用,就不显示数字。0格式说明符是一个零占位符,显示相应的数字,如果数字不存在,就显示零。

1.2.3 自定义字符串格式

格式字符串不限于内置类型,可以为自己的类型创建自定义格式字符串。为此,只需要实现接口 IFormattable。

首先是一个简单的Person类,它包含FirstName和LastName属性:

public class Person
{
    public string FirstName { get;set };
    public string LastName { get;set };

    public override string Tostring() => FirstName + "" + LastName;
}

为了获得这个类的简单字符串表示,重写基类的ToString方法。这个方法返回由FirstName和LastName组成的字符串。

除了简单的字符串表示之外,Person类也应该支持格式字符串F,返回名L和姓A,后者代表“all”;并且应该提供与ToString方法相同的字符串表示。为实现自定义字符串,接口IFormattable定义了带两个参数的 ToString方法:一个是格式的字符串参数,另一个是FormatProvider参数。FormatProvider参数未在示例代码中使用。可以基于区域值使用这个参数,进行不同的显示,因为CultureInfo类实现了该接口。

实现了这个接口的其他类是NumberFormatInfo和DateTimeFormatInfo.。可以把实例传递到ToString方法的第二个参数,使用这些类配置数字和DateTime的字符串表示。ToString方法的实现代码只使用switch语句,基于格式字符串返回不同的字符串。为了使用格式字符串直接调用ToString方法,而不提供格式提供程序,应重载ToString方法。这个方法又调用有两个参数的ToString方法:

public class Person:IFormattable{
    public string FirstName { get;set };
    public string LastName { get;set };
    public override string Tostring()=> FirstName + "" + LastName;
    public virtual string Tostring(string format)=>Tostring (format,null);
    public string Tostring(string format,IFormatProvider formatProvider){
        switch (format){
            case null:
            case "A":
                return Tostring();
            case "F":
                return FirstName;
            case "L":
                return LastName;
            default:
                throw new FormatException ($"invalid format string {format}");
        }
    }
}

有了这些代码,就可以显式传递格式字符串,或隐式使用字符串插值,以调用ToString方法。隐式的调用使用带两个参数的ToString方法,并给FormatProvider参数传递null。

var p1 =  new Person { FirstName = "Stephanie", LastName = "Nagel" };
Console.WriteLine (p1.Tostring ("F"));
Console.WriteLine ($"{p1:F)");

1.3  正则表达式

正则表达式作为小型技术领域的一部分,在各种程序中都有着难以置信的作用,但并不是所有的开发人员都知道这一点。正则表达式可以看做一种有特定功能的小型编程语言:在大的字符串表达式中定位一个子字符串。它不是一种新技术,最初它是在UNIX环境中开发的,与Perl和JavaScript编程语言一起使用得比较多。Microsoft把它移植到Windows中,到目前为止在脚本语言中用得比较多。但System. Text.RegularExpressions命名空间中的许多.NET类都支持正则表达式。.NET Framework的各个部分都使用正则表达式,例如,在ASP.NET的验证服务器控件中就使用了正则表达式。

注意,.NET正则表达式引擎是为兼容Perl 5的正则表达式而设计的,但有一些新特性。
使用正则表达式,可以对字符串执行许多复杂而高级的操作,例如:

●       区分(可以是标记或删除)字符串中所有重复的单词,例如,把The computer books books转换为The computer books。

●       把所有单词都转换为标题格式,例如把this is a Title转换为This Is A Title。

●       把长于3个字符的所有单词都转换为标题格式,例如把this is a Title转换为This is a Title。

●       确保句子有正确的大写形式。

●       区分URI的各个元素(例如http://www.wrox.com,提取出协议、计算机名、文件名等)。

本质上是实例化了一个对象System.Text.Regular Expressions.RegEx(甚至更简单:调用静态的RegEx()方法),给它传送要处理的字符串和一个正则表达式(这是一个字符串,包含用正则表达式语言编写的指令),就可以了。

正则表达式字符串初看起来像是一般的字符串,但其中包含了转义序列和有特定含义的其他字符。例如,序列\b表示一个字的开头和结尾(字的边界),如果要表示正在查找以字符th开头的字,就可以编写正则表达式\bth(即序列字边界是– t – h)。如果要搜索所有以th结尾的字,就可以编写th\b(序列t – h–字边界)。但是,正则表达式要比这复杂得多,包括可以在搜索操作中找到存储部分文本的工具性程序。本节仅介绍正则表达式的功能。

1.3.1 RegularExpressionsPlayaround示例

下面将开发一个小示例RegularExpressionsPlayaround,执行并显示一些搜索的结果,说明正则表达式的一些特性,以及如何在C#中使用.NET正则表达式引擎。

string Text =
@"This comprehensive compendium provides a broad and thorough investigation of all
aspects of programming with ASP.NET. Entirely revised and updated for the 3.5
Release of .NET, this book will give you the information you need to master ASP.NET
and build a dynamic, successful, enterprise Web application.";
string Pattern = "ion";

//这个方法的参数是一些输入文本、一个模式和RegexOptions枚举中的一组可选标志。
MatchCollection Matches = Regex.Matches(Text, Pattern,

                                    RegexOptions.IgnoreCase |

                                    RegexOptions.ExplicitCapture);

foreach (Match NextMatch in Matches)
{
   Console.WriteLine(NextMatch.Index);
}

为了说明正则表达式.NET类,我们先进行一次纯文本的搜索,这次搜索不带任何转义序列或正则表达式命令。在这段代码中,使用了System.Text.RegularExpressions命名空间中Regex类的静态方法Matches()。在本例中,指定所有的搜索都不应区分大小写。另一个标记ExplicitCapture 改变了收集匹配的方式,对于本例,这样可以使搜索的效率更高,其原因详见后面的内容(尽管它还有这里没有介绍的其他用法)。Matches()返回MatchCollections对象的引用。匹配是一个技术术语,表示在表达式中查找模式实例的结果,用System.Text.RegularExpressions.Match来代表。因此,我们返回一个包含所有匹配的MatchCollection,每个匹配都用一个Match对象来表示。在上面的代码中,只是在集合中迭代,使用Match类的Index属性,返回输入文本中匹配所在的索引。

下表描述了RegexOptions枚举的一些选项。

但正则表达式的功能主要取决于模式字符串。原因是模式字符串不仅仅包含纯文本。如前所述,它还可以包含元字符和转义序列,其中元字符是给出命令的特定字符,而转义序列的工作方式与C#的转义序列相同,它们都是以反斜杠\开头的字符,具有特殊的含义。

例如,假定要查找以n开头的字,就可以使用转义序列\b,它表示一个字的边界(字的边界是以字母数字表中的某个字符开头,或者后面是一个空白字符或标点符号)。可以编写如下代码:

string Pattern = @"\bn";

// string Pattern = @"ion\b"; 查找以序列ion结尾的字

// string Pattern = @"\bn\S*ion\b";查找以字母a开头,以序列ion结尾的所有字

MatchCollection Matches = Regex.Matches(Text, Pattern,

                                    RegexOptions.IgnoreCase |

                                    RegexOptions.ExplicitCapture);

注意字符串前面的符号@。要在运行时把\b传递给.NET正则表达式引擎,反斜杠\不应被C#编译器解释为转义序列。

下表是可以使用的一些主要的特定字符或转义序列,但这个表并不完整,完整的列表请参考MSDN文档。

如果要搜索一个元字符,也可以通过带有反斜杠的转义字符来表示。例如,.(一个句点)表示除了换行字符以外的任何字符,而\.表示一个点。

可以把替换的字符放在方括号中,请求匹配包含这些字符。例如,[1|c]表示字符可以是1或c。如果要搜索map或man,可以使用序列ma[n|p]。在方括号中,也可以指定一个范围,例如[a-z]表示所有的小写字母,[A-E]表示A到E之间的所有大写字母,[0-9]表示一个数字。如果要搜索一个整数(该序列只包含0到9的字符),就可以编写[0-9]+(注意,使用+字符表示至少要有这样一个数字,但可以有多个数字,所以9、 83和 854等都是匹配的)。

1.3.2  匹配、组合和捕获

正则表达式的一个很好的特性是可以把字符组合起来,其方式与C#中的复合语句一样。在C#中,可以把任意数量的语句放在花括号中,把它们组合在一起。其结果就像一个复合语句那样。在正则表达式模式中,也可以把任何字符组合起来(包括元字符和转义序列),像处理一个字符那样处理它们。唯一的区别是要使用圆括号,而不是花括号,得到的序列称为一个组。

例如,模式(an)+定位序列an的任意重复。量词+只应用于它前面的一个字符,但因为我们把字符组合起来了,所以它现在把重复的an作为一个单元来对待。(an)+应用到输入文本bananas came to Europe late in the annals of history上,会从bananas中选择出anan。另一方面,如果使用an+,则程序将从annals中选择ann,从bananas中选择出两个an。表达式(an)+可以提取出an、anan、ananan等,而表达式an+可以提取出an、ann、annn等。

但是,组的功能要比这强大得多。在默认情况下,把模式的一部分组合为一个组时,就要求正则表达式引擎按照这个组来匹配,或按照整个模式来匹配。换言之,可以把组当作一个要匹配的模式来返回,如果要把字符串分解为各个部分,这种模式就是非常有效的。

例如,URI的格式是<protocol>://<address>:<port>,其中端口是可选的。它的一个示例是http://www.wrox.com:4355。假定要从一个URI中提取协议、地址和端口,而且紧邻URI的后面可能有空白(但没有标点符号),就可以使用下面的表达式:


该表达式的工作方式如下:首先,前导b序列和结尾b序列确保只需要考虑完全是字的文本部分。在这个文本部分中,第一组https?)会识别http或htps协议。S字符后面的?指定这个字符可能出现0次或1次,因此找到http和htps。括号表示把协议存储为一组。

第二组是一个(://),它仅指定字符://

第三组([.\w]+)比较有趣。这个组包含一个放在括号里的表达式,该表达式要么是句点字符(.),要么是用\w指定的任意字母数字字符。这些字符可以重复任意多次,因此匹配www.wrox.com。

第四组([\s:]([\d]{2,5})?)是一个较长的表达式,包含一个内部组。在该组中,第一个放在括号中的表达式允许通过s指定空白字符或冒号。内部组用\d指定一个数字。表达式{2,5}指定前面的字符(数字)允许至少出现两次但不超过5次。数字的完整表达式用内部组后面的?指定允许出现0次或1次。使这个组变成可选非常重要,因为端口号并不总是在URI中指定;事实上,通常不指定它。

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

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

相关文章

【C++堆(优先队列)】2233. K 次增加后的最大乘积|1685

本文涉及知识点 C堆(优先队列) 贪心&#xff08;决策包容性) LeetCode 2233. K 次增加后的最大乘积 给你一个非负整数数组 nums 和一个整数 k 。每次操作&#xff0c;你可以选择 nums 中 任一 元素并将它 增加 1 。 请你返回 至多 k 次操作后&#xff0c;能得到的 nums的 最…

用Python实现运筹学——Day 15: 线性规划的项目实战

一、学习内容 在本节中&#xff0c;我们将综合应用之前学习的线性规划知识&#xff0c;解决一个复杂的实际问题。通过这个实战项目&#xff0c;进一步理解线性规划在资源分配问题中的应用。 二、实战案例&#xff1a;公司资源分配问题 2.1 问题描述&#xff1a; 某公司生产两…

Conda答疑

文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…

Spring Boot:打造下一代医院管理系统

3系统分析 3.1可行性分析 通过对本医院管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

electron打包报错-winCodeSign无法下载

electron打包报错-winCodeSign下载问题 问题描述 downloaded urlhttps://registry.npmmirror.com/-/binary/electron-builder-binaries/winCodeSign-2.6.0/winCodeSign-2.6.0.7z duration1.577s⨯ cannot execute causeexit status 2outerrorOutERROR: Cannot create s…

C++ | Leetcode C++题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; class Solution {constexpr static int dx[4] {0, 1, 0, -1};constexpr static int dy[4] {1, 0, -1, 0}; public:int dfs(int x, int y, vector<vector<int>> &grid, int n, int m) {if (x < 0 || x > n || y <…

【Canvas与色彩】十二等分多彩隔断圆环

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>隔断圆环Draft4十二等分多彩</title><style type"text…

华为Nova12活力版nova 11,FIN-AL60/FOA-AL00手机忘记密码到底怎么解锁无法激活设备已锁定平台工具软件固件使用解决方案

手机忘记密码到底怎么解锁修理好.弄好刷机解锁视频看了一些没弄好现在图文分享最祥细的教程方法有帐用户锁不再难了华为Nova12活力版nova 11,FIN-AL60/FOA-AL00设备关联至陌生华为账号并被锁定 忘记密码如何破解恢复出厂设置了怎样才能激活-怎样跳过帐号密码激活手机,解锁方案工…

SQL专项练习第六天

Hive 在处理不同数据需求时的灵活性和强大功能&#xff0c;包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。本文将介绍五个 Hive 数据处理问题的解决方案&#xff0c;并通过实际案例进行演示。 先在home文件夹下建一个hivedata文件夹&a…

玩客云刷派享云教程

玩客云刷机教程 扫描该二维码注册 打开网站&#xff08;xxxxxxx&#xff09; 输入你的id 然后点击生成就可以拿到该设备的下载链接(UBOOT) 详细文档&#xff1a;https://www.123684.com/s/WGAwjv-SNlv3 &#xff08;有不懂看详细文档&#xff09; 准备⼯作 •⼯具软件&…

【JVM系列】深入理解Java虚拟机(JVM)的核心技术:从加载到初始化的全过程解析(一、Java类加载器)

文章目录 【JVM系列】深入理解Java虚拟机&#xff08;JVM&#xff09;的核心技术&#xff1a;从加载到初始化的全过程解析(一、Java类加载器)1. 类加载器加载的过程2. Class文件读取来源3. 类加载器的分类4. 那些操作会初始化类加载器5. 类加载器的双亲委派机制6. ClassLoader源…

Dolma:包含三万亿Token的语言模型预训练研究开放语料库

前言 原论文&#xff1a;Dolma: an Open Corpus of Three Trillion Tokens for Language Model Pretraining Research 摘要 关于训练当前最佳性能语言模型的预训练语料库的信息很少被讨论——商业模型很少详细说明它们的数据&#xff0c;即使是开源模型也往往在没有训练数据…

操作系统 | 学习笔记 | 王道 | 3.2 虚拟内存管理

3.2 虚拟内存管理 3.2.1 虚拟内存的基本概念 传统存储管理方式的特征 传统存储管理方式 连续分配 单一连续分配固定分区分配动态分区分配 非连续分配 基本分页存储管理基本分段存储管理基本段页式存储管理 特征&#xff1a; 一次性&#xff1a; 作业必须一次性全部装入内存后…

『网络游戏』制作提示弹窗UI【03】

将上一章的创建角色界面隐藏 创建一个空节点重命名为DynamicWnd 设置父物体为伸展 钉在中间创建一个Text文本组件 添加动画Animation组件 创建自定义动画Animation动画 点击创建 选择指定文件夹 拖拽至Animation 使用记录动画方式编辑动画首先点击红点录制 在第0帧设置文字透明…

最简单的示例:通过JDBC查询数据

引言 在现代企业级应用开发中&#xff0c;持久层框架&#xff08;如 MyBatis、Hibernate 等&#xff09;极大地简化了数据库操作&#xff0c;提高了开发效率和代码的可维护性。本文将通过一个最简单的示例&#xff0c;演示如何使用 JDBC 连接数据库、执行 SQL 语句以及处理结果…

LabVIEW技术难度最大的程序

在LabVIEW开发中&#xff0c;技术难度最大的程序通常涉及复杂的系统架构、高精度的控制要求、大量数据处理&#xff0c;以及跨平台或多硬件设备的集成。以下是几类具有高技术难度的LabVIEW程序&#xff1a; 1. 高精度实时控制系统 LabVIEW中涉及高精度实时控制的系统程序&…

金纳米星“融入”水凝胶,原位生长的奥秘,应用前景的探索

大家好&#xff01;今天来了解一项在三维水凝胶表面生长金纳米星的研究——《Growing Gold Nanostars on 3D Hydrogel Surfaces》发表于《Chemistry of Materials》。水凝胶在生物医学等诸多领域有着重要应用&#xff0c;而金纳米星具有独特的光学性质。这项研究通过原位合成的…

【含开题报告+文档+PPT+源码】基于SpringBoot的校园互助平台设计与实现【包运行成功】

开题报告 现代大学校园是一个多样化且充满活力的环境&#xff0c;拥有来自不同文化和地域的学生。然而&#xff0c;这种多样性也伴随着一系列挑战&#xff0c;包括学业压力、心理健康问题、社交挑战以及适应新环境的困难。面对这些挑战&#xff0c;学生常常感到信息获取困难和…

redis——哨兵机制

redis中提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 主从复制是实现redis高可用性的基石&#xff0c;从节点宕机时我们仍然可以将请求发送给主节点或者其他从节点&#xff0c;而当主节点宕机的时候&#xff0c;无法执行写操作&#xff0c;无…

Maven、Git

1. Maven 安装 &#xff08;2024.6.23&#xff09;最新版MAVEN的安装和配置教程&#xff08;超详细&#xff09;_maven安装-CSDN博客 2. 配置IDEA和Maven的关联 1. 单个关联 &#xff08;每新建一个项目都要配一次&#xff0c;不推荐&#xff09; 配置maven home path&#…