String是一个奇怪的引用类型

点击蓝字

关注我们

开局两张图,内容全靠刷。

马甲哥看到这样的现象,一开始还是有点懵逼。

这个例子,string是纯粹的引用类型,但是在函数传值时类似于值传递;我之前给前后示例的内存变化图吧:

根因就是大多数高级语言都把String设计成不可变的: 由一个字符串池管理字符串面值。

为什么被设计成不可变。

这个我还真的搜索了一下[1]

总结起来:

  1. string 被设计为不可变, 是因为 string在现代任何语言中,使用很频繁:多个对象可能都是这个字符面值, 然后就设计一个Pool来存储string。
    既然pool里面共享字符面值,修改的时候又不能影响到别人,那就只好重新拷贝产生新的字符面值。

  2. 不可变资源消除了多线程中的资源竞争:对于文本的修改都会导致创建新空间,因此在多个线程同时访问文本无需设置锁,这对高频使用的String很友好。

  3. 字符串不变性对于[在哈希表中使用字符串作为键]很友好,需要计算哈希值的对象必须是不可变的,以确保哈希值不变。

  • 一个有意思的现象是:String虽然是引用类型,字符串对比时却表现的像值类型

string str1="FooFoo";
string strFoo="Foo";
string str2= strFoo + strFoo;
return str1 == str2;           //  返回true

正因为String不可变性 & Pool的机制,频繁变更字符串,会在池中产生很多临时的不用的字符串,所以我们有了优化的套路:

StringBuilder

代表可变的字符串,一旦修改不会尝试创建新对象,而是动态扩展内存

var ss = new StringBuilder("Hello ", 100);  // 初次字符容量100
ss.Append("www.cnblogs.com");
Console.WriteLine(ss.ToString());  // ss打印结果为:222

Span

Span该出圈了,
Span提供对内存连续区域的类型安全访问,该内存可以位于堆、堆栈、甚至是非托管内存;
与String不可变性相关的是ReadOnlySpan(值类型), 提供内存数据的只读视图,每次切片不会产生新对象,而是在已存在的连续空间上创造新的视图。

var text = "https://www.cnblogs.com/JulianHuang/p/14817621.html";
ReadOnlySpan<char> nameSpan = text.AsSpan(8, 15);
nameSpan = nameSpan.Slice(4,7);
Console.WriteLine(nameSpan.ToString());

总结输出

今天从两张诡异的编程图聊到了String的不可变性、内存分布, 延伸谈到了

  1. String不可变性的设计设计考量(有先射箭再画靶的嫌疑☺️)

  2. 针对频繁修改的String如何做内存优化

不是自吹,文章内容在业界相当硬核(多次被各大佬/CSDN点赞/转载),阅读和关注不是目的,更希望得到更多的阅读反馈,互相促进认知的提升(相当真诚☺️)。

参考资料

[1]

这个我还真的搜索了一下: https://www.c-sharpcorner.com/UploadFile/230635/why-string-are-immutable-in-dotnet/

# 更多精彩

今天因为你的点赞,让我元气满满!

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

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

相关文章

js 浅拷贝直接赋值_浅析JavaScript解析赋值、浅拷贝和深拷贝的区别

一、赋值(Copy)赋值是将某一数值或对象赋给某个变量的过程&#xff0c;分为&#xff1a;1、基本数据类型&#xff1a;赋值&#xff0c;赋值之后两个变量互不影响2、引用数据类型&#xff1a;赋**址**&#xff0c;两个变量具有相同的引用&#xff0c;指向同一个对象&#xff0c;…

限时秒杀│中科院推荐!6个引自美国NASA盒子,玩转科学

比勤奋更重要的&#xff0c;是孩子的思维能力。从上幼儿园开始&#xff0c;很多父母很喜欢给孩子报各种兴趣班&#xff0c;比如钢琴班、英语班、乐高班、报各种各样的课程&#xff0c;就是希望孩子具有18般武艺&#xff0c;赢在起跑线上。其实除了外在的能力&#xff0c;不显山…

html语言可以写模版继承吗,Django框架(十一):模板介绍、模板语言、模板继承、HTML转义...

1. 模板介绍1.1 模板的功能产生html&#xff0c;控制页面上展示的内容。模板文件不仅仅是一个html文件。模板文件包含两部分内容&#xff1a;静态内容&#xff1a;css、js、html。动态内容&#xff1a;用于动态去产生一些页面内容。通过模板语言来产生。1.2 模板文件的使用通常…

sed-笔记

一&#xff0e;sed脚本编程的方法论 1. 在着手做之前要弄清楚想做什么。2. 明确地描述处理的过程。3. 在提交最终的改变之前反复测试这个过程。注1&#xff1a;检测脚本最好的方式&#xff0c;是使用不同的输入样本进行测试并观察结果。二&#xff0e;…

.NET6又出新版本,新增这几个大杀器!

.NET6 Preview4终于发布了&#xff0c;作为第4个预览版&#xff0c;伴随着Build2021发布的&#xff0c;器更新内容也是非常丰富的。推荐关注的有以下11项&#xff1a;引入最小 API异步流HTTP 日志中间件新项目中使用 Kestrel 作为默认启动IConnectionSocketFeature改进单页应用…

蜗杆参数法设计_技术贴 | 减速器结构及设计的注意事项

减速机器用于低转速大扭矩的传动设备&#xff0c;原理是把电动机、内燃机、马达或其它高速运转的动力&#xff0c;通过减速机的输入轴上齿数少的齿轮啮合输出轴上的大齿轮&#xff0c;从而达到减速的目的&#xff1b;大小齿轮的齿数之比&#xff0c;就是传动比。减速器是一种由…

听说热爱生活的人都关注了他们

全世界有3.14 % 的人已经关注了数据与算法之美在信息爆炸的时代快节奏的生活里 你是否曾有一瞬间觉得忙碌而空虚&#xff1f;以下10个优质公众号能让你在闲暇的时候不断的提升自我&#xff0c;拓宽视野愿以书卷气&#xff0c;行我路千里近现代史研究通讯ID&#xff1a;jxsdyjtx…

基于abp vnext制作项目脚手架

首先说明&#xff0c;尊重原创&#xff0c;本文是参考https://www.cnblogs.com/myshowtime/p/14507675.html这篇文章写的&#xff0c;里面内容有部分是直接拷贝过来的。感谢作者分享&#xff01;&#xff01;&#xff01;前期准备工作使用命令 abp new LS.Template --template …

Windows Server 2012 DHCP 服务器中的新功能:故障转移和策略

Windows Server 2012 DHCP 服务器中的新功能如下&#xff1a; DHCP 故障转移&#xff1a;此功能提供让两个 DHCP 服务器服务于 同一子网或作用域的 IP 地址和选项配置的能力&#xff0c;前提是 DHCP 服务对客户端持续可用。两个 DHCP 服务器复制它们之间的租用信息&#xff0c;…

android mvc mvp 简书,浅析 MVP,MVC,MVVM模式(Android)

前言当我们接手一个项目的时候&#xff0c;经常会发现一个activity或fragment动辄上千行甚至上万行代码&#xff0c;这给阅读带来很大的困扰&#xff0c;如果想读懂代码&#xff0c;需要花费很多时间跟精力。引起这个问题的原因想必大家都了解&#xff0c;随着人员不断变动&…

android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

学Java能拿高薪吗&#xff1f;Java中常见排序算法有哪些&#xff1f;作为老牌编程语言&#xff0c;Java拥有广阔的市场占有率&#xff0c;几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java。为了加入到Java这一高薪行业&#xff0c;很多人会选择专业学习一下&#x…

最全知识点总结!| 大数据学习路线指南

全世界只有3.14 % 的人关注了数据与算法之美大数据是对海量数据进行存储、计算、统计、分析处理的一系列处理手段&#xff0c;处理的数据量通常是TB级&#xff0c;甚至是PB或EB级的数据&#xff0c;这是传统数据处理手段所无法完成的&#xff0c;其涉及的技术有分布式计算、高并…

数组 边界 检查的几种实现方法

检查传递给函数的数组边界常用方法1.传递指向数组第一个和最后一个元素的下一个位置的指针。2. 将第二个形参定义为表示数组的大小3.数组本身放置一个检测位三种实现方法&#xff1a;#include<iostream> using namespace std; int sumArray(const int *beg,const int *e…

欢迎来到开源的世界!

✉️ 请查收您的保姆级开源百科编程导航 致力于推荐优质编程资源 ????项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️大家好&#xff0c;我是鱼二&#xff0c;今天推荐一份开源知识入门的在线电子书《开源指北》。正如官方对这本书的描述&…

html图片宽度高度等比例绽放,css图片自动绽放大小,左右,上下居中

无标题页.pic{max-height:400px;max-width:400px;_width:expression("400px");_height:expression((document.documentElement.clientHeight||document.body.clientHeight)>400?"400px":"");/*_width:expression((document.documentElement.…

归纳推理测试没做完_朋友买了1斤紫菜,2年还没吃完,我教他这样做,2个月就吃完了...

朋友买了1斤紫菜&#xff0c;2年还没吃完&#xff0c;我教他这样做&#xff0c;2个月就吃完了紫菜成熟啦&#xff0c;这段时间回老家&#xff0c;都会看到紫菜养殖户脸上挂着笑容&#xff0c;因为今年的紫菜收成还不错。回家就为了拿紫菜&#xff0c;因为紫菜成熟的季节&#x…

机器学习都需要有哪些数学知识?

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。机器学习是一个异常丰富的研究领域&#xff0c;有大量未解决的问题&#xff1a;公正、可解释性、易用性。如同所有的学科一样&#xff0c;它的基本思想不是请求式的过程&#xff0c;而是需要耐心地用高级数学框架思考…

(转)64bit上安装32位oracle 10 g出现错误:无法定位承诺工序输入点 getprocessimagifilenamew 于动态链接库PSAPI.DLL...

转自http://jonelove00.iteye.com/blog/1685206安装时以最高管理员身份运行&#xff1a;红色字体为自己加上去的代码找到..\database\stage\prereq\db\refhost.xml打开加入<OPERATING_SYSTEM> <VERSION VALUE"6.1"/></OPERATING_SYSTEM> 再找…

10kv电压互感器型号_电压互感器型号大全

电压互感器简介电压互感器(Potentialtransformer简称PT&#xff0c;Voltagetransformer也简称VT)和变压器类似&#xff0c;是用来变换线路上的电压的仪器。但是变压器变换电压的目的是为了输送电能&#xff0c;因此容量很大&#xff0c;一般都是以千伏安或兆伏安为计算单位&…

C# 常用接口学习 IEnumerableT

我们先去看看公开的.Net4.0的源程序中IEnumerable<T>、IEnumerable、IEnumerator<T>和IEnumerator这四个接口是如何声明的&#xff1a;需加微信交流群的&#xff0c;请加小编微信号zls20210502&#xff0c;切记备注 加群&#xff0c;小编将会第一时间邀请你进群&am…