C++string的使用
· CSDN的uu们,大家好。这里是C++入门的第十六讲。
· 座右铭:前路坎坷,披荆斩棘,扶摇直上。
· 博客主页: @姬如祎
· 收录专栏:C++专题

目录
1.构造函数
1.1 string()
1.2 string(const char* s)
1.3 string(const char* s, size_t n)
1.4 string(size_t n, char c)
1.5 string (const string& str)
1.6 string (const string& str, size_t pos, size_t len = npos)
2. size_t size() const
3. size_t length() const
4. size_t max_size() const
5. resize
5.1 void resize (size_t n)
编辑5.2 void resize (size_t n, char c)
6. size_t capacity() const
7: void reserve (size_t n = 0)
8. void clear()
9. bool empty() const
10. operator[]
11. char at(size_t pos)
12. char& back()
13. char& front()
14. operator+=
15. string& append (const char* s)
编辑
16. void push_back (char c)
17. insert()
17.1 string& insert (size_t pos, const char* s)
17.2 string& insert (size_t pos, size_t n, char c)
18. string& erase (size_t pos = 0, size_t len = npos)
19. void pop_back()
20. const char* c_str() const
21. find()
21.1 size_t find (const char* s, size_t pos = 0) const
21. 2 size_t find (char c, size_t pos = 0) const
22. rfind()
编辑
22.1 size_t rfind (const char* s, size_t pos = npos) const
22.2 size_t rfind (char c, size_t pos = npos) const
23. string substr (size_t pos = 0, size_t len = npos) const
1.构造函数
1.1 string()
这是 string 的无参构造,在 string 的底层就是构造了一个空字符串:“”,即在下标为 0 的位置存储了一个 '\0' 。
#include<iostream>
#include<string>
using namespace std;int main()
{string s;cout << s;return 0;
}

这是VS2022下看到的结果。VS对 string 的封装比较复杂,他一上来就开了很多空间,并且直接把开辟出来的空间全部初始化为了0。我们看到的现象会因编译器的不同有所差异。
1.2 string(const char* s)
这个构造函数表示可以使用常量字符串来初始化 string!或者使用字符数组来初始化,字符数组的数组名也是 char* 类型的嘛,char* 是可以用const char* 来接收的。
#include<iostream>
#include<string>
using namespace std;int main()
{string s("csdn yyds!");cout << s << endl; //输出:csdn yyds!char arr[12] = { 'c', 's', 'd', 'n', ' ','y' ,'y', 'd', 's', '!'};string s1(arr);cout << s1 << endl; //输出:csdn yyds!}
1.3 string(const char* s, size_t n)
这个构造函数表示可以使用一个常量字符串 或者 字符数组的前 n 个字符来初始化 string。
#include<iostream>
#include<string>
using namespace std;int main()
{string s("csdn yyds!", 4);cout << s << endl; //输出:csdnchar arr[10] = { 'c', 's', 'd', 'n', ' ','y' ,'y', 'd', 's' };string s1(arr, 4);cout << s1 << endl; //输出:csdn
}
1.4 string(size_t n, char c)
这个构造函数表示可以用 n 个 字符 来构造一个string对象。
#include<iostream>
#include<string>
using namespace std;int main()
{string s(8, '8');cout << s << endl; //输出:88888888
}
1.5 string (const string& str)
这个构造函数表示可以使用另一个string对象来构造一个string对象(拷贝构造)。
#include<iostream>
#include<string>
using namespace std;int main()
{string s("csdn yyds!");string s1(s);cout << s1 << endl; //输出:csdn yyds!
}
1.6 string (const string& str, size_t pos, size_t len = npos)
这个构造函数表示可以用另一个 string 对象 从 pos 位置开始截取 n 个字符来构造一个 string 对象。
我们看到 len 参数有个缺省值:npos。这个 npos 是定义在 string 类中一个public属性的静态常量,其值为 -1。但是因为 len 的类型为无符号的整形,因此 len 的实际大小是无符号整形的最大值。我们可以直接打印 npos :
#include<iostream>
#include<string>
#include<climits>
using namespace std;int main()
{cout << (int)string::npos << endl; //int输出的nposcout << string::npos << endl; //size_t输出的nposcout << UINT32_MAX << endl; //32位机器下无符号整形的最大值}

当我们的 pos + len 大于参数一字符串的长度时就是截取 pos 位置后的全部字符来构造string。不传 len ,len = npos 那可是相当大呢!所以不传 len 就是截取 pos 后面的全部字符来构造string。
#include<iostream>
#include<string>
using namespace std;int main()
{string s("csdn yyds!");string s1(s, 5, 4); //从下标为 5 的位置(第一个y)向后截取 4 个字符来构造一个stringcout << s1 << endl; //输出 yydsstring s2(s, 5, 188); //len 传入很大cout << s2 << endl; //输出 yyds!string s3(s, 5); //不传lencout << s3 << endl; //输出 yyds!}
2. size_t size() const
这个函数用于返回一个 string 对象存储的有效字符的数量。为什么要有后面的那个const呢?我们知道这个const是修饰 *this 的,加上const 常对象与普通对象都可以调用啦!
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("I love scdn!");cout << s1.size() << endl; //输出:12const string s2("csdn yyds!");cout << s2.size() << endl; //输出:10}
3. size_t length() const
这个接口跟 size_t size() const 实现的效果是一毛一样的!那你就可能会问了,为什么设计者要搞出来两个功能相同的接口呢?那是因为 string 类的出现早于 STL 库,string 在很久以前是没有 size() 这个接口的。但是呢 STL出现以后,求容器的大小都是实现的 size(), 于是 string 就也加上了一个 size() 接口!
4. size_t max_size() const
这个函数返回 一个string 对象多能存储的最多的字符数量,每个编译器的结果不尽相同!此函数用得也不多!

5. resize
5.1 void resize (size_t n)
在 string 的底层维护了一个字符数组,一个表示有效字符个数的size,和字符数组实际的容量capacity。而 resize 函数就是用来改变有效字符的个数的函数。
情况1:当 n 小于原字符串的大小,底层实现很简单,直接改变size,在添加一个 '\0' 表示字符的结束即可! 因此会保留原字符串的数据。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("csdn yyds");s1.resize(4);cout << s1 << endl; //输出:csdncout << s1.size() << endl; //输出:4}
通过调试观察 string 的内存,也可以证明我的描述:

情况2: 当 n 大于原字符串的大小。会将原字符串的 size 扩展到相应的大小,但是在 VS2022 上,多余的空间他会全部初始化为 0 ,resize 之后的字符串的打印结果与原来并无不同。但是可以通过打印 size 来观察不同!
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("csdn yyds!");cout << s1.size() << endl; //resize之前输出:10s1.resize(20);cout << s1 << endl; //输出:csdn yyds!cout << s1.size() << endl; //输出:20
}
通过观察 string 内存,能够证实我的讲解:
5.2 void resize (size_t n, char c)
这是一个重载的版本,在改变字符串大小的同时增加了初始化的功能!这个初始化的功能仅在 n 的大小大于原字符串的大小时生效(也就是 5.1 情况二的时候生效。)
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("csdn yyds!");s1.resize(20, 'a');cout << s1 << endl; //输出: csdn yyds!aaaaaaaaaacout << s1.size() << endl;//输出:20
}
6. size_t capacity() const
我们刚才提到 string 的底层维护了一个 capacity 用来表示字符数组的实际大小,这个函数就是用来返回这个 capacity 的。此函数用得也不多!
不同编译器对于 string 维护的数组开空间的规则不同,因此返回相同字符串的capacity,不同编译器得到的值也不一定相同。下面是VS2022的结果:
#include<iostream>
#include<string>
using namespace std;int main()
{string s;cout << s.capacity() << endl; //输出:15
}
7: void reserve (size_t n = 0)
这个函数是用来改变 string 维护的字符数组的实际容量的。

8. void clear()
清空一个字符串的内容,使之变为空串!

9. bool empty() const
判断一个字符串是不是空串!
10. operator[]
operator[] 能够使得字符串支持下标访问,这个是平时用得非常多的!他提供了两个版本,一个是非const版本,一个是const版本。const 修饰的string对象,通过下标访问得到的字符不允许修改。而非const的string对象通过下标访问得到的字符可以修改。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello world");s1[5] = '#';cout << s1 << endl; //输出:hello#world
}
const修饰的string对象不可修改:

11. char at(size_t pos)
此函数完全可以被operator[]代替哈,at函数返回的是下标为 pos 的字符。 同样也有const版本和非const版本。
12. char& back()
该函数返回字符串的最后一个字符,同样也有 const 和非const 两个版本。
const版本:const char& back() const
非const版本:char& back()
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello world");char& tail = s1.back(); //非const支持修改tail = 'C';cout << s1 << endl;//输出:hello worlC
}
13. char& front()
该函数返回字符串的第一个字符,同样有 const 和非 const 两个版本。
const char& front() const
char& front()
14. operator+=
string 重载了 += 运算符,支持一个字符串加等一个字符,一个字符串常量,一个string 对象。
#include<iostream>
#include<string>
using namespace std;int main()
{string s("csdn yyds!");s += 'a';cout << s << endl; //输出:csdn yyds!as += "bbb";cout << s << endl; //输出:csdn yyds!abbbstring tmp("ccc");s += tmp;cout << s << endl; //输出:csdn yyds!abbbccc
}
15. string& append (const char* s)
往一个string对象的末尾追加一个 常量字符串 或者 数组。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello ");s1.append("world");cout << s1 << endl; //输出:hello world
}
我们查阅 资料 发现 append 重载了很多版,是不是觉得string的设计有点冗余。个人感觉最好用的还是operator+=。
16. void push_back (char c)
往string后面追加一个字符,只能说非常鸡肋。不如operator+=。
17. insert()
我们可以看到 insert 重载了巨多版本,真令人头大呢!我们就讲讲两个具有代表性的。其他的都大同小异。

17.1 string& insert (size_t pos, const char* s)
该函数用于在pos位置插入一个 常量字符串 或者 字符数组(字符数组一定要有 '\0' 哦)。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");s1.insert(5, " hi"); //在下标为5的位置插入 hicout << s1 << endl; //输出:hello hi csdn}
17.2 string& insert (size_t pos, size_t n, char c)
该函数用于在pos位置插入n个相同的字符。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");s1.insert(5, 5, '1'); //在下标为5的位置插入5个'1'cout << s1 << endl; //输出:hello11111 csdn}
18. string& erase (size_t pos = 0, size_t len = npos)
这个函数可以将从pos位置开始,后面的len个字符全部删除,不传len,表示len很大,也就是移除pos后面的所有字符啦!
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");s1.erase(0, 6); //移除下标 0 后面的6个字符cout << s1 << endl; //输出:csdnstring s2("hello csdn");s2.erase(1); //移除下标1后的所有字符cout << s2 << endl; //输出:h}
19. void pop_back()
这个函数简单,删除string的最后那个字符。
20. const char* c_str() const
这个函数可以返回 C风格的字符串。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");const char* s = s1.c_str();cout << s << endl; //输出:hello csdnreturn 0;
}
C风格的字符串:char类型的数组,每个下标对应一个字符,末尾有一个 '\0'。

21. find()
find 重载的版本也是比较多的呢!老规矩讲常用的!

21.1 size_t find (const char* s, size_t pos = 0) const
这个函数用来在一个string中,从pos位置开始查找一个常量字符串。pos不传的话就是从头查找。如果查找到了,返回起始下标,如果没有查找到返回 npos 。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");//从下标为1的位置开始查找 csdn 这个常量字符串cout << s1.find("csdn", 1) << endl; //输出:6//从下标为7的位置开始查找 csdn 这个常量字符串cout << s1.find("csdn", 7) << endl; //输出:4294967295(这是无符号整形的最大值)cout << (int)s1.find("csdn", 7) << endl; //输出:-1}
21. 2 size_t find (char c, size_t pos = 0) const
这个函数用来在一个string中,从pos位置开始查找字符 c。pos不传就是从头开始查找。一旦查找成功 (即从pos位置开始第一个字符 c ),返回查找成功的下标,否则返回 npos。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");//从下标为 1 的位置开始查找字符'l'cout << s1.find('l', 1) << endl; //输出:2//从下标为 4 的位置开始查找字符'l'cout << s1.find('l', 4) << endl; //输出:4294967295(这是无符号整形的最大值)cout << (int)s1.find('l', 4) << endl; //输出:-1
}
22. rfind()
我们可以看到参数的形式跟find完全一样!rfind只是从后往前找罢了!
22.1 size_t rfind (const char* s, size_t pos = npos) const
表示:在 string 对象中从pos位置往前,查找常量字符串 s 。pos不传就是从末尾向前查找。查找成功,返回起始位置的下标,查找失败,返回 npos。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");//从下标为 8 的位置往前,查找常量字符串 csdncout << s1.rfind("csdn", 8) << endl; //输出:6//从下标为 5 的位置往前,查找常量字符串 csdncout << s1.rfind("csdn", 5) << endl; //输出:4294967295(这是无符号整形的最大值)cout << (int)s1.rfind("csdn", 5); //输出:-1}
22.2 size_t rfind (char c, size_t pos = npos) const
表示:从pos位置开始向前查找字符 c 。pos不传就是从末尾向前查找。一旦查找成功 (pos位置往前,第一个字符c的下标) 返回该下标,否则返回 npos。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");//从下标为 8 的位置开始向前查找字符'c'cout << s1.rfind('c', 8) << endl; //输出:6//从下标为 5 的位置开始向前查找字符'c'cout << s1.rfind('c', 5) << endl; //输出:4294967295(这是无符号整形的最大值)cout << (int)s1.rfind('c', 5) << endl; //输出:-1
}
23. string substr (size_t pos = 0, size_t len = npos) const
这是用截取原string对象中的一部分连续字符,返回一个新的string对象。简言之:获取子串。
表示:从 pos 位置开始截取 len 个长度的字符来构造新的string。pos不传默认从头开始截取。len不传默认截取到末尾。
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello csdn");//不传len,默认截取到末尾,从 6 截取到末尾cout << s1.substr(6) << endl; //输出:csdn//从 0 开始截取 5 个字符cout << s1.substr(0, 5) << endl; //输出 hello
}
总结:不需要死记硬背,用得多了自然就记得了!string的接口真的很多,记不起来查查文档就知道了!
string - C++ Reference (cplusplus.com)

相关文章:
C++string的使用
CSDN的uu们,大家好。这里是C入门的第十六讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1.构造函数 1.1 string() 1.2 string(const char* s) 1.3 string(const …...
闲着也是闲着,自己写歌东西玩一玩,碰碰脑子,简单快乐一点,双人出数的小游戏,后续还带补充
主旨就是每个人出一个数,目前限制两人,之后考虑多人,然后对其取差值,获取到一个结果,比对结果的奇偶数,还可以看下两人出同一个数的概率,反正概率上是一个比较稳定的。 当然自己想玩的活也可以做…...
牛客网 -- WY28 跳石板
题目链接: 跳石板_牛客题霸_牛客网 (nowcoder.com) 解题步骤: 参考代码: void get_approximate(vector<int>& v,int n) {//求约数,从2到sqrt(n)即可,原因看图解//这里一定要等于sqrt(n),例如16…...
[正式学习java③]——字符串在内存中的存储方式、为什么字符串不可变、字符串的拼接原理,键盘录入的小细节。
一、字符串 1.字符串在内存中的存储方式 🔥在java中,内存中有两个地方可以存储字符串,一个是字符串池,一个是堆内存,串池中的字符串不会重复,而堆中的字符串每次都会开辟一块新的空间,因为维护…...
行情分析——加密货币市场大盘走势(10.18)
大饼昨日小幅度的下跌回调了,很快又上涨。目前看下来震荡向下刚刚开始,可以关注后续情况。大饼依然保持看空不做空,目前除了独立行情的币,就大饼非常强势。目前从MACD日线来看,还是保持多头趋势,预计明后两…...
高并发场景下常见的限流算法及方案介绍
应用场景 现代互联网很多业务场景,比如秒杀、下单、查询商品详情,最大特点就是高并发,而往往我们的系统不能承受这么大的流量,继而产生了很多的应对措施:CDN、消息队列、多级缓存、异地多活。 但是无论如何优化&…...
虹科分享 | 选择SAS还是NVMe?虹科网络基础带您一探究竟!
存储架构师需要通过确保他们选择的存储解决方案提供支持其生态系统所需的安全性、稳定性、可扩展性和管理特性来应对当今的业务挑战。当他们考虑采用新的存储技术时,在采用新技术之前,他们应该权衡和审查一些基本的考虑因素。新的存储协议不断进入市场&a…...
在ERP管理系统中,库存管理的基本流程是什么?
在ERP管理系统中,库存管理的基本流程是什么? 下面我就以我们公司正在用的简道云库存管理系统为例,为大家进行库存管理基本流程的演示 这个系统是我们公司自己搭建的,大家如果有需要可以自取,也可以在模板的基础上自行…...
Ruby 之 csv 文件读写
csv 文件写入 require csvtitle ["col1", "col2"] contents [["row11", "row12"], ["row21", "row22"]]csv1 CSV.open("test1.csv", "wb") do |csv|# write file titlecsv << titl…...
Android AMS——进程LRU列表更新(十七)
AMS对进程的管理主要体现在两个方面: 进程LRU列表动态更新:动态调整进程在mLruProcesses列表的位置进程优先级动态调整:实际是调整进程oom_adj的值。 这两项调整和系统进行自动回收有关,当内存不足时,系统会关闭一些进程来释放内存,下面就依据这两方面来看…...
【数据可视化】—大屏数据可视化展示
【数据可视化】—大屏数据可视化展示 一、数据可视化 数据可视化的目的:借助于图形化工具,清晰有效的传达与沟通信息。 数据可视化可以把数据从冰冷的数字转换成图形,揭示蕴含在数据中的规律和道理。 二、 免费数据可视化库 Echarts 百度…...
计算机算法分析与设计(12)---贪心算法(最优装载问题和哈夫曼编码问题)
文章目录 一、最优装载问题1.1 问题表述1.2 代码编写 二、哈夫曼编码2.1 哈夫曼编码概述2.2 前缀码2.3 问题描述2.4 代码思路2.5 代码编写 一、最优装载问题 1.1 问题表述 1. 有一批集装箱要装上一艘载重量为 c c c 的轮船,已知集装箱 i ( 1 ≤ i ≤ n ) i(1≤i≤…...
打造属于自己的vue图标库
hfex-icon图标库 Install npm i -D hfex-icon主要提供2种使用方式 方式一 通过svg图标资源,借助unplugin-icons库将svg图标文件生成vue组件,然后通过vue组件的引入方式在vue中使用 unplugin-icons 兼容vue2和vue3 在vue.config.js的plugins中配置…...
C++11线程池
使用 condition_variable::wait(unique_lock<mutex>&lck, Predicate pred) 时,必须保证条件变量通过notify唤醒的同时,wait 的第二个参数 Predicate 返回 true 了才可以往下走。必须两个条件同时满足,如果notify的时候Predicate返回…...
企业打造VR虚拟展厅,开启商务洽谈新时代!
现代化数字营销中,企业做了虚拟线上展厅和不做虚拟展厅的对比是很明显的,VR虚拟展厅让企业产品、企业环境、企业实力的展示更加真实、直观。虚拟展厅是一种在线展示企业形象和品牌的新型方式,随着VR技术的发展,虚拟展厅正在逐步取…...
linux部署gitlab
1. 配置yum源: vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabled1 2. 更新本地缓存 sudo yum install -y gitlab-ce 3. 安装相关依赖 yum …...
c++_learning-基础部分
文章目录 基础认识:语言特性(面向对象编程):c的类(相当于c中的结构体):三大特性:c包含四种编程范式:优缺点: c程序编译的过程:预处理->编译&am…...
支持PC端、手机端、数据大屏端的Spring Cloud智慧工地云平台源码
技术架构:微服务JavaSpring Cloud VueUniApp MySql 智慧建筑工地云平台主要利用大数据、物联网等技术,整合工地信息、材料信息、工程进度等,实现对建筑项目的全程管理。它可以实现实时监测和控制,有效解决施工中的问题,…...
给cmd控制台程序 套壳 美化
给cmd控制台程序套壳美化,可以获取程序的标准输出和报错信息。 # _*_ coding: utf-8 _*_ """ 控制台程序启动器,杜绝黑窗口。 Time: 2023/10/18 15:28 Author: Jyun Version: V 0.1 File: main.py Blog: https://ctrlcv.…...
【系统架构设计】架构核心知识: 1 构件和中间件
目录 一 构件 1 构件的特性 2 构件、对象和模块的对比 3 构件的复用...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...


