Java中的常用类 --String
学习目标
- 掌握String常用方法
- 掌握StringBuilder、StringBuffer
- 了解正则
1.String
● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型,也就是说String类中已经提前定义好了很多方法都是用来处理字符串的,所以String中常用的方法大家都要掌握;
先介绍下String 类的特点 :
- String是不可变的类,也就是说String对象是不可变的对象,那么什么叫不可变的对象我们稍后给大家解释
- 当给String引用重新赋值时, 执行的操作为: 在内存中创建一个新的字符串地址, 使引用指向新地址
1.1 层级
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {}
1.2 创建方法和常用构造
两种创建方式
- 双引号直接赋值
- 利用构造创建
//双引号直接赋值
//String用法的一种特例String 引用名 = "值";
常用构造
String(byte[] bytes) //使用IDE里面默认的编码方式
String(byte[] bytes, Charset charset)
String(byte[] bytes, String charsetName)
String(byte[] bytes, int offset, int length)
//将字节数组数据使用指定的编码方式转换(解码)一个字符串对象String(char[] value)
String(char[] value, int offset, int count)
//将字符数组数据转换成字符串对象String(StringBuffer buffer) String(StringBuilder builder)
案例:字节数组转String
private static void demo1() {//乱码: 编码方法至少有2种存在 保证编码方式统一//创建String类对象String s = "hello";byte[] bytes = {-26, -120, -111, -28, -69, -84};//String str1 = new String(bytes,);//解码 将看不懂的字节的数据转换成字符串//String str1 = new String(bytes, StandardCharsets.UTF_8);//String str1 = new String(bytes, "UTF_8");String str1 = null;try {str1 = new String(bytes, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}//使用的是哪一种编码格式?//获得当前ide里面默认的编码格式 Charset 维护所有编码格式的System.out.println(Charset.defaultCharset());System.out.println(str1);//鎴戜滑
}
案例:字符数组转String
private static void demo2() {//将字符数组转换成Stringchar[] chars = {97, 100, 'a', '1', '我'};String s = new String(chars);System.out.println(s);String s1 = new String(chars, 0, 3);System.out.println(s1);}
1.3 常用方法
1.3.1 与数组相关的方法
1.byte[] getBytes()
2.byte[] getBytes(Charset charset)
3.byte[] getBytes(String charsetName)
//将字符串的数组转换成字节符数组 (与编码格式有关)----> 编码 4.char[] toCharArray() //遍历字符数据
5.String[] split(String regex) //分割 使用指定的字符串的数据对原字符串进行分割
6.String[] split(String regex, int limit) //使用指定的正则模式分割字符串
1.3.2 字符串搜索相关的方法
1. int indexOf(String str);//指定字符串第一次出现的索引位置 没有找到-1
2. int indexOf(String str, int fromIndex)//指定的索引开始 查询指定字符串第一次出现的索引位置 没有找到-13. int lastIndexOf(String str);// 指定字符串最后一次出现的索引位置 没有找到-1
4. int lastIndexOf(String str, int fromIndex);
// 指定的索引开始 查询指定字符串最后一次出现的索引位置 没有找到-1
1.3.3 提取字符串相关的方法
1.char charAt(int index) //获得指定索引字符数据 index
private static void charatdemo() {String str = "hello";for (int index = 0; index < str.length(); index++) {System.out.println(str.charAt(index));}
}
2.String substring(int beginIndex) //截取字符串 根据指定的索引截取原字符串部分数据
3.String substring(int beginIndex, int endIndex) //包头不包尾
private static void substringdemo() {String filePath = "C:\\demo.\\a\\b\\a.txt";//查询最后一个\\的索引位置 lastIndexOf()String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);System.out.println(fileName);//获得文件扩展名//文件上传 不同的用户传的文件名以及后缀都一样//A: C:\\a.jpg//B: D:\\a.jpg//上传到同一个目录---> 文件名重名的文件
// System.currentTimeMillis()//System.out.println(UUID.randomUUID().toString());String extension = filePath.substring(filePath.lastIndexOf(".") + 1);System.out.println(extension);String str = "hello";System.out.println(str.substring(2, 4));//案例: 152****3456String phone = "15234567890";//长度固定的String begin = phone.substring(0,3);String end = phone.substring(7);String result = begin+"****"+end;System.out.println(result);
}
4.String toUpperCase() //字母 转大写
5.String toLowerCase() //字母 转小写
6.String trim() //去除空格String stripLeading()String stripTrailing()
7.String concat(String str)
8.static String join(CharSequence delimiter, CharSequence... elements)
private static void demo12() {//模拟用户注册 将数据转换成: id-name-pass-ageScanner input = new Scanner(System.in);int idIndex = 1001;System.out.println("录入name:");String name = input.next();System.out.println("录入pass:");String pass = input.next();System.out.println("录入age:");int age = input.nextInt();//将id name age pass 转换成指定格式//id-name-pass-age//String info = idIndex + "-" + name + "-" + pass + "-" + age;//System.out.println(info);//String concat(str) 类似+//String concat = String.valueOf(idIndex++).concat("-").concat(name).concat("+").concat(pass).concat("-").concat(String.valueOf(age));//String.join();String info = String.join("-", String.valueOf(idIndex), name, pass, String.valueOf(age));System.out.println(info);input.close();}
9.String repeat(int count)
1.3.4 可变长参数
public static void main(String[] args) {//调用的时候 传递参数0个method();//调用的时候 传递多个参数method("aa", "bb");}/*** 如何定义可变长参数 任意数据类型...* 注意点:若方法中包含可变长参数,则必须出现在最后* 在方法内部,把可变长参数当成数组来进行使用* 调用的时候 可传值 0或多个都可以* @param a*/public static void method(String... a) {System.out.println(a);// 在方法内部,把可变长参数当成数组来进行使用System.out.println(a.length);System.out.println(Arrays.toString(a));}
1.3.5 比较判断方法相关的方法
1.int compareTo(String anotherString) //比较2个字符串是否相等 返回值: 0 正整数 负整数2.int compareToIgnoreCase(String str) //不区分大小写比较2个字符串是否相等 返回值: 0 正整数 负整数 3.boolean contains(CharSequence s) //判断字符串是否包含指定字符串
4.boolean equals(Object anObject) //比较2个字符串是否相等
5.boolean equalsIgnoreCase(String anotherString) //不区分大小写比较2个字符串是否相等6.boolean endsWith(String suffix) //判断字符串是否以指定字符串结尾
7.boolean startsWith(String prefix) //判断字符串是否以指定字符串开头8.boolean isEmpty() //判断字符串是否是空 "" length==09.boolean isBlank() //判断字符串是否是空 "" " " length==010.boolean matches(String regex)
1.3.6 替换相关的方法
1.String replace(char oldChar, char newChar) //使用指定的字符的数据替换原字符串里面指定的所有的字符
2.String replace(CharSequence target, CharSequence replacement) //使用指定的字符串的数据替换原字符串里面指定的所有的字符串3.String replaceAll(String regex, String replacement)
4.String replaceFirst(String regex, String replacement) // 使用字符串替换满足正则语法模式要求的字符串的数据
1.4 运行时常量池(串池)
● 字符串是使用的最频繁的类型,如果每次使用字符串对象,都用new关键字进行创建,那么堆内存中就会出现大量的字符串对象而占用大量堆空间;
● 为了提高JVM对字符串操作的内存使用率,JVM在方法区中提供了一块区域专门用于存储字符串字面量,这块区域位于方法区的运行时常量池;
● 当直接把字面量 赋值给字符串引用的时候, JVM会先去常量池中找这个字符串对象是否存在,如果存在直接返回此对象的地址 否则就会新建一个字符串对象 然后返回这个对象的内存地址;
● 如果+两边都是常量,查询规则还是先去常量池中找字符序列是否存在,如果存在直接返回地址 否则就新建对象;
● 如果+两边一旦有变量,拼接后的字符串对象是先存放在一个缓冲区中 并没有在常量池中
/*** 常量池 在方法区中 :里面放的是字符序列*/public static void method9() {String str1 = "java";// 如果存在字面量 直接返回地址String str2 = "java";String str3 = "javaSun";String str4 = "javaSun";String str5 = "java" + "Sun"; // 如果+两边都是常量,查询规则还是先去常量池中找字符序列是否存在,如果存在直接返回地址 否则就新建对象String str6 = str1 + "Sun"; // 如果+两边一旦有变量,拼接后的结果是存放在一个缓冲区中 没有在常量池中// new 都在堆空间/*String str3 = new String("java");String str4 = new String("java");*/System.out.println("equals1:" + (str1 == str2));
// System.out.println("equals2 :" + (str1 == str3));System.out.println("+两边有常量了" + (str5 == str4));System.out.println("+两边有变量了" + (str6 == str4));}
- intern(): 其功能可以做到 在运行期间 把字符对象放入常量池
private static void demo17() {//并发里面 充当锁对象String str1 = "hello";String intern1 = str1.intern();System.out.println(str1 == intern1);//trueString str2 = new String("hello");String intern2 = str2.intern();System.out.println(str1 == str2);//falseSystem.out.println(str2 == intern2);//falseSystem.out.println(str1 == intern2);//true
}
1.5 字符串不可变性
- 对象内部的成员变量的值是不可变的因此是不可变的类型,使用final修饰了!
1.6 总结String两种创建方式的区别
双引号直接赋值:
直接使用串池. 先在串池中查找是否存在指定内容, 存在则直接指向, 不存在则先在串池中创建后指向利用构造创建:
间接使用串池. 无论如何都会开辟对象空间, 再去串池中查找指定内容, 存在则直接存储串池地址, 不存在则先在串池中创建后存储该地址
String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);//t 串池地址相同String s1 = new String("edf");String s2 = new String("edf");String str3 = "edf";System.out.println(s1 == s2);//f 对象地址不同System.out.println(s1 == str3);//f 对象地址 != 串池地址
2.StringBuffer/StringBuilder
- StringBuffer/StringBuilder也是用来处理字符串的,因此方法和String方法非常类似;
- 并非常量, 值可变
- StringBuffer : JDK1.0 线程安全,效率低
- StringBuilder :JDK5.0 线程不安全, 效率高
这两个类的方法一模一样
2.1 层级
public final class StringBuilderextends AbstractStringBuilderimplements java.io.Serializable, Comparable<StringBuilder>, CharSequence{}public final class StringBufferextends AbstractStringBuilderimplements Serializable, Comparable<StringBuffer>, CharSequence{}
2.2 特点
-
不能使用串池
-
必须通过构造创建
-
必须调用方法操作字符串内容, 无法使用运算符
2.3 常用方法
1. append(值): 在末尾追加内容2. insert(index,str); 在指定的索引位置 插入字符串数据3. delete(startIndex,endIndex) 删除从startIndex到endIndex的字符串的数据 包头不包尾4. deleteCharAt(index) 删除指定索引的字符数据5. insert(index,str); 在指定的索引位置 插入字符串数据6. replace(startIndex,endIndex,newStr) 使用newStr替换从startIndex到endIndex的字符串的数据 包头不包尾7. reverse(): 内容反转
2.4 对比
类名 | 值是否可变 | 线程安全 | 性能 | 内存(拼接) |
---|---|---|---|---|
String | 不可变 | 安全(final) | 其次 | + new 占据更多内存 |
StringBuffer | 可变 | 安全(synchronized) | 最后 | 只有1个对象 |
StringBuilder | 可变 | 不安全 | 最快 | 只有1个对象 |
2.5 与String的相互转换
- String 转 可变长字符串
StringBuilder 引用名 = new StringBuilder(String引用名 | "值");
- 可变长字符串 转 String
String 引用名 = StringBuilder引用名.toString();
String str = "abc";//转为可变长字符串StringBuilder sb = new StringBuilder(str);//转StringString str2 = sb.toString();
当对String进行运算符操作时, 如
+=
, 会在底层中将其转换为StringBuilder完成操作, 再将StringBuilder转换回String
String s1 = "abcdefg";
String s2 = "abcd";s2 += "efg";//先将s2内容转换进StringBuilder, 在SB中完成拼接操作, 再转换回StringSystem.out.println(s1 == s2);//f//以下动作不会操作StringBuilderString str = "abc";str = "edf";str = "123";
3 正则表达式
● 能够读懂即可,一般在前端的js,校验数据。(判断用户客户端提交的数据是否满足正则要求)
● 后端编程语言 java也是支持正则匹配
3.1 概念
● 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。
● 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,
● 通常被用来检索、替换那些符合某个模式(规则)的文本
String类的方法中: 支持正则编写。1. String[] split(String regex,int limit); //根据正则模式要求分割源字符串的数据2. boolean matches(String regex); //检索/判断字符串的数据(文本数据)是否满足正则模式的要求。3. String replaceAll(String regex,String replacement);//使用replacement替换原字符串中满足正则模式要求的文本数据String replaceFirst(String regex,String replacement);// 使用replacement替换原字符串中第一个满足正则模式要求的文本数据
3.2 语法
● 参考正则在线手册: https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
● 语法: String regx = “^([]{})([]{})([]{})([]{})$”;
● ^:可以省略。以xxx开头。
● $:可以省略。以xxx结尾。
● (): 可以省略。代表的是一个组/域。简称域段。域和域之间没有关系的。正则模式里面: \n代表第n个域。从1开始。一般用于执行"替换功能"的时候,域段必须编写的。动态的获得第n个域里面的内容作为替换内容的话 $n
● []:可以省略。编写限定的字符数据。[a-zA-Z0-9_]{1}
● {}: 可以省略。 限定[]里面字符内容的次数。[ab]{1,3} {正整数}
● : 转义符号
● : 匹配前面的子表达式零次或多次 [a]{0,} [a] a*
● +: 匹配前面的子表达式一次或多次 [a]{1,} a{1,} a+
● .: 匹配除“\n”之外的任何单个字符 [.]{1} 匹配任意一个字符
● x|y: 匹配x或y
● [xyz]: 匹配所包含的任意一个字符 [a-z]{1} [A-Z]{1} [0-9]{1} \d 等价于[0-9] \d{1}
● \s: 匹配的是空白字符 \s+ 匹配字符串里面出现>=1次的空格内容
● \w: 等价于[A-Za-z0-9_]
4.String方法汇总
5.StringBuilder方法总结
相关文章:

Java中的常用类 --String
学习目标 掌握String常用方法掌握StringBuilder、StringBuffer了解正则 1.String ● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型,也就是说String类中已经提前定义好了很多方法都是用来处理字符串的,所以Str…...

PWM(脉宽调制)技术详解:从基础到应用实践示例
PWM(脉宽调制)技术详解:从基础到应用实践示例 目录 PWM(脉宽调制)技术详解:从基础到应用实践示例学前思考:一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…...
Hutool - DB 连接池配置集成
在实际开发中,尤其是在高并发场景下,使用连接池来管理数据库连接是非常必要的,它可以显著提高数据库操作的性能和效率。Hutool - DB 支持集成多种常见的连接池,如 HikariCP、Druid 等。下面分别介绍如何将这两种连接池集成到 Huto…...

激光工控机在自动化生产线中有什么关键作用?
激光工控机作为自动化生产线的核心设备,通过高精度控制、快速响应和智能化集成,在提升效率、保障质量、实现柔性制造等方面发挥着不可替代的作用。以下是其关键作用的具体分析: 一、实现高效连续生产: 1.高速加工能力࿱…...

Visual Studio Code的下载安装与汉化
1.下载安装 Visual Studio Code的下载安装十分简单,在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了...

nlp|微调大语言模型初探索(3),qlora微调deepseek记录
前言 上篇文章记录了使用lora微调llama-1b,微调成功,但是微调llama-8b显存爆炸,这次尝试使用qlora来尝试微调参数体量更大的大语言模型,看看64G显存的极限在哪里。 1.Why QLora? QLoRA 在模型加载阶段通过 4-bit 量化大幅减少了模型权重的显存占用。QLoRA 通过 反量化到 …...
【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量
【全栈】SprintBootvue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】…...

基于ffmpeg+openGL ES实现的视频编辑工具(一)
在深入钻研音视频编辑开发这片技术海洋时,相信不少开发者都和我有同样的感受:网络上关于音视频编辑工具实现的资料繁多,理论阐释细致入微,代码片段也随处可见。然而,一个显著的缺憾是,缺乏一个完整成型的 A…...
面试完整回答:SQL 分页查询中 limit 500000,10和 limit 10 速度一样快吗?
首先:在 SQL 分页查询中,LIMIT 500000, 10 和 LIMIT 10 的速度不会一样快,以下是原因和优化建议: 性能差异的原因 LIMIT 10: 只需要扫描前 10 条记录,然后返回结果。 性能非常高,因为数据库只…...

Linux系统管理(十六)——通过WSL配置windows下的Linux系统(可视化界面与远程连接)
前言 WSL,即Windows Subsystem for Linux,是微软在Windows 10和Windows 11中引入的功能,允许用户在Windows上原生运行Linux的命令行工具和应用程序,无需启动完整的Linux虚拟机或进行双系统启动。 开启WSL服务 开启虚拟化 进入…...
【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?
在分布式系统中,RabbitMQ 自身不直接提供消息幂等性保障机制,但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践: 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一IDÿ…...

flutter在安卓模拟器上运行
目录 下载android studio,然后把其中的模拟器设为环境变量,然后在vscode/cursor中使用插件,打开安卓模拟器一、下载android studio网址mac 下载64位 ARM 二、启动android studio三、设置SDK四、打开文件 打开模拟器五、运行程序六、在vscode/…...
linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现: 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后,Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...
与本地电脑PDF文档对话的PDF问答程序
文章目录 PDF问答程序程序流程处理PDF文档创建问答链 在探索和学习新技术时,了解LangChain框架的理论知识固然重要,但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作,你可…...

QT之改变鼠标样式
QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标,…...

后端开发:开启技术世界的新大门
在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...

Sun-Panel:简洁且美观的导航首页开源项目!!
在这个数字化飞速发展的时代,我们几乎每个人都拥有自己的服务器或者NAS。但问题来了,管理这些设备往往需要记住一大堆复杂的命令和界面,对于像了不起这样追求简洁生活的程序员来说,简直是噩梦! 今天介绍一款界面清爽&…...

第4章 信息系统架构(四)
4.6 网络架构 网络是信息技术架构中的基础,不仅是用户请求和获取IT信息资源服务的通道,同时也是 信息系统架构中各类资源融合和调度的枢纽。特别是云计算、大数据和移动互联网技术飞速发 展的今天,网络更加成为实现这些技术跨越的重要环节。…...

【Java八股文】07-Redis面试篇
【Java八股文】07-Redis面试篇 Redis面试篇认识redis为什么用 Redis 作为 MySQL 的缓存? 数据结构讲一下Redis底层的数据结构ZSet底层是由什么实现的 线程模型Redis 是单线程吗?Redis怎么进行I/O多路复用的?Redis 采用单线程为什么还这么快&a…...

Windows PyCharm的python项目移动存储位置后需要做的变更
项目使用的venv虚拟环境,因此项目移动存储位置后需要重新配置python解释器的位置,否则无法识别,若非虚拟环境中运行,则直接移动后打开即可,无需任何配置。 PyCharm版本为2021.3.3 (Professional Edition),其…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...