成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

String是一個奇怪的引用類型

開發 后端
string 被設計為不可變, 是因為 string在現代任何語言中,使用很頻繁:多個對象可能都是這個字符面值, 然后就設計一個Pool來存儲string。

[[402400]]

本文轉載自微信公眾號「精益碼農」,作者小碼甲 。轉載本文請聯系精益碼農公眾號。

開局兩張圖,內容全靠刷。

馬甲哥看到這樣的現象,一開始還是有點懵逼。

這個例子,string是純粹的引用類型,但是在函數傳值時類似于值傳遞;我之前給前后示例的內存變化圖吧:

根因就是大多數高級語言都把String設計成不可變的: 由一個字符串池管理字符串面值。

為什么被設計成不可變。

這個我還真的搜索了一下[1]:

總結起來:

  • string 被設計為不可變, 是因為 string在現代任何語言中,使用很頻繁:多個對象可能都是這個字符面值, 然后就設計一個Pool來存儲string。

既然pool里面共享字符面值,修改的時候又不能影響到別人,那就只好重新拷貝產生新的字符面值。

  • 不可變資源消除了多線程中的資源競爭:對于文本的修改都會導致創建新空間,因此在多個線程同時訪問文本無需設置鎖,這對高頻使用的String很友好。
  • 字符串不變性對于[在哈希表中使用字符串作為鍵]很友好,需要計算哈希值的對象必須是不可變的,以確保哈希值不變。

一個有意思的現象是:String雖然是引用類型,字符串對比時卻表現的像值類型

  1. string str1="FooFoo"
  2. string strFoo="Foo"
  3. string str2= strFoo + strFoo; 
  4. return str1 == str2;           //  返回true 

正因為String不可變性 & Pool的機制,頻繁變更字符串,會在池中產生很多臨時的不用的字符串,所以我們有了優化的套路:

StringBuilder

代表可變的字符串,一旦修改不會嘗試創建新對象,而是動態擴展內存

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

Span

Span該出圈了,

Span提供對內存連續區域的類型安全訪問,該內存可以位于堆、堆棧、甚至是非托管內存;

與String不可變性相關的是ReadOnlySpan(值類型), 提供內存數據的只讀視圖,每次切片不會產生新對象,而是在已存在的連續空間上創造新的視圖。

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

總結輸出

今天從兩張詭異的編程圖聊到了String的不可變性、內存分布, 延伸談到了

String不可變性的設計設計考量(有先射箭再畫靶的嫌疑??)

針對頻繁修改的String如何做內存優化

不是自吹,文章內容在業界相當硬核(多次被各大佬/CSDN點贊/轉載),閱讀和關注不是目的,更希望得到更多的閱讀反饋,互相促進認知的提升(相當真誠??)。

參考資料

[1]這個我還真的搜索了一下: https://www.c-sharpcorner.com/UploadFile/230635/why-string-are-immutable-in-dotnet/

 

責任編輯:武曉燕 來源: 精益碼農
相關推薦

2021-07-24 13:11:19

Redis數據技術

2009-08-27 16:39:26

C# String類型

2022-05-09 10:47:08

登錄SpringSecurity

2022-08-11 12:28:09

For-elsePython

2021-08-11 07:53:22

Git rejecthint

2024-08-14 13:24:24

2021-08-02 08:21:53

Python編程語言開發

2016-12-15 08:54:52

線程sessionopenSession

2020-04-20 09:02:33

函數RPCCPU

2022-03-07 05:53:41

線程CPU代碼

2022-02-12 22:16:53

TypeScript類型字符串

2013-06-28 17:28:04

推送

2017-11-29 18:11:00

ERP管理數字化

2019-12-09 15:00:48

TomcatServlet容器

2012-05-10 16:32:01

Hadoop

2017-12-26 15:38:02

2023-01-30 09:01:34

DecoratorsJS語法

2021-08-27 07:47:06

引用類型

2023-04-18 08:14:27

ElixirRustWebRTC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 瑟瑟视频在线看 | 天天精品在线 | 欧美激情一区 | 成人无遮挡毛片免费看 | 欧美在线亚洲 | 在线午夜 | 欧美a在线观看 | 国产精品一区二区免费看 | 欧美视频1| 亚洲国产一区视频 | 欧美日韩精品一区二区三区四区 | 久久久久久国产精品免费免费狐狸 | 操久久 | 日韩中文字幕一区二区 | 欧美国产一区二区 | 亚洲热在线视频 | 天堂亚洲| 天天射网站 | 午夜欧美一区二区三区在线播放 | www国产精品 | 欧美a∨ | 岛国在线免费观看 | 视频一二三区 | 久久久久久久一区 | 久久久.com| 日韩在线免费观看视频 | 在线播放一区 | 一区二区三区免费在线观看 | 久草在线影| 午夜影院在线观看视频 | 国产精品成人一区 | 九九热精品视频 | 精品国产区 | 国产视频一区二区 | 久久久久久久一区 | 色噜噜狠狠色综合中国 | 亚洲天堂av网 | 成人午夜视频在线观看 | 国产精品一区二区三区在线 | 性做久久久久久免费观看欧美 | 久久久网 |