[VB.NET Tips]再谈字符串连接之内置池
CLR自动维护一个称为”内置池“(暂存池)(intern pool)的表,在编译时此表包含程序中声明的每个唯一的字符串常量的单个实例,以及以编程方式创建的String类的任何唯一实例。
内置池被实现为散列表。使用散列表即表示,一个字符串可以通过一个数字或”散列码“来表示。这样比较和搜索字符串就非常有效,因为这不是逐个字符比较字符串,而仅仅比较散列值。
内置池节省字符串存储空间。如果将一个字符串常量赋给几个变量,则每一个变量引用内置池中相同的常量,而不是引用具有相同值的String类的几个不同实例。
可以测试如下代码:
Const APPNAME As String = "运维应用程序"
Console.WriteLine(String.IsInterned(APPNAME) <> Nothing)
Dim s1 As String
Dim s2 As String
s1 = "这是一个测试的字符串"
s2 = "这是一个测试的字符串"
Console.WriteLine(String.IsInterned(s1) <> Nothing)
Console.WriteLine("s1的散列值:{0}", s1.GetHashCode())
Console.WriteLine("s2的散列值:{0}", s2.GetHashCode())
Dim s3 As String = s1 & DateTime.Now().ToString()
Console.WriteLine("s3的散列值:{0}", s3.GetHashCode())
Console.WriteLine(String.IsInterned(s3) <> Nothing)
运行以下代码会发现.NET会内置了包含字符串常量,以及编程方式创建的字符串。
会发现s1和s2引用同个字符串实例。s3不会被内置,因为在编译时并不能确认s3的具体内容。也可以使用String.Intern强制内置一个变量。
用图来表示一下:

那么内置有什么好处呢,对比下面的代码,第二个方法比第一个方法快3倍以上。
Sub Main()
Console.Write("请输入你的名字:")
Dim userName As String = Console.ReadLine()
Method1(userName)
Method2(userName)
Console.Read()
End Sub
Public Sub Method1(ByVal username As String)
Dim strHTML As String
'每次循环创建3次字符串,分配3次内存
Dim startms As Integer = Environment.TickCount()
For i As Integer = 1 To 1000000
strHTML = "<HTML><HEAD></HEAD><BODY>"
strHTML &= "我的名字是:"
strHTML &= username
strHTML &= "</BODY></HTML>"
Next
Dim endms As Integer = Environment.TickCount()
Console.WriteLine("总耗时:{0}微秒", (endms - startms))
End Sub
Public Sub Method2(ByVal username As String)
Dim strHTML As String
Const strPrefix As String = "<HTML><HEAD></HEAD><BODY>"
Const strSuffix As String = "</BODY></HTML>"
'只创建一次字符串
Dim startms As Integer = Environment.TickCount()
For i As Integer = 1 To 1000000
strHTML = strPrefix & "请输入你的名字:" & userName & strSuffix
Next
Dim endms As Integer = Environment.TickCount()
Console.WriteLine("总耗时:{0}微秒", (endms - startms))
End Sub
以上方法只是抛砖引玉,在实际应用中灵活应用。在一些web应用程序中有大量字符串拼接操作的,可以多使用内置。毕竟处理速度快,能够处理的并发就越高。
[VB.NET Tips]再谈字符串连接之内置池的更多相关文章
- 【字符串算法1】 再谈字符串Hash(优雅的暴力)
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...
- Python 再谈字符串
字符串除了要用引号来创建之外,其他和元组一样,不能修改,如果要修改只能用切片或者拼接的方式. 其他的什么乱七八糟的运算符都一样 一些不同 capitalize()-将字符串的第一个字母大写 str1. ...
- [VB.NET Tips]字符串连接
在很多应用场景下我们都需要对字符串进行拼接操作. 在每一次连接字符串时,都要在堆上分配新的内存空间,每一个分配都有一定的消耗. 较长的字符串在堆中分配,对其进行连接操作需要花费很长的时间,先连接小的字 ...
- 关于vb编程之字符串连接/拼接的方法与技巧
在VB中,笔者知道的字符串的拼接方法主要有两种拼接符号,一种为"&"符,另一种则为"+"符 一.其中&连接运算符用于强制将两个表达式作为字符串连 ...
- 再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结
这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理汇总.如果对文中的题目全部了然于胸,觉得对整个angular框架应该掌握的七七八八了.希望志同道合的通知补充 ...
- 再谈HTTP2性能提升之背后原理—HTTP2历史解剖
即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- SQL注入的字符串连接函数
在select数据时,我们往往需要将数据进行连接后进行回显.很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数.在sqli中,常见的字符串连接函数有concat(),group_ ...
- 浅谈HTTP中Get与Post的区别/HTTP协议与HTML表单(再谈GET与POST的区别)
HTTP协议与HTML表单(再谈GET与POST的区别) GET方式在request-line中传送数据:POST方式在request-line及request-body中均可以传送数据. http: ...
随机推荐
- 深圳市宁远电子大骆驼DLT3288C-韦根输入接口说明
DLT3288C 板卡上有一组韦根接口,位置如下图所示: 注意:韦根与 RS485 是同时使用一组 Pin 脚,功能二选一.板子默认是 RS485,需要韦 根功能的,需跳电阻. 1.设备控制节点 ...
- ajax中的后台返回数据data的意义
- 记录一则clear重做日志文件的案例
1.官方文档描述 2.故障报错信息 3.分析解决问题 1.官方文档描述 关于Clearing a Redo Log File的官方文档描述: A redo log file might become ...
- 【转】Python实现智能五子棋
前言 棋需要一步一步下,人生需要一步一步走.千里之行,始于足下,九层之台,起于累土. 用Python五子棋小游戏. 基本环境配置 版本:Python3 相关模块: 本文所做工作如下: (1) 五子棋界 ...
- 翻牌动画(CocosCreator)
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 在游戏中,有时候为了通过一种有意思的途径,让用户在一些物品中随机获取某种物品,除了前面我们提到的使用大转盘抽奖获得, ...
- MSIL实用指南-生成foreach语句
foreach可以迭代数组或者一个集合对象.foreach语句格式是它的生成步骤是foreach (<成员> in <集合>) <循环体> 一.声明三个变量,loc ...
- XHTML 和 HTML 中的 iframe
1. XHTML 有什么? XHTML是更严谨更纯净的HTML版本. 2.HTML和XHTML之间的差异 ①XHTML元素必须被正确的嵌套 /!--错误写法--/ <p><i> ...
- iOS仿写下厨房
把之前简书的博客搬到博客园了,还是放在一个地方看着舒服. 先看一下做的效果,是不是还不错?(可以看一下早餐那块的轮播,上面盖着一个都是点点的图片,但是它不是和轮播一起滚动的,是盖在轮播上面的,需要在那 ...
- Beego orm 模型字段与数据库类型的对应
深度学习,ORM 推荐的对应数据库类型,在此列出,自动建表功能也会以此为标准.默认所有的字段都是 NOT NULL MySQL go mysql int, int32-设置auto或者名称为Id in ...
- Another Version of Inversion 二维树状数组求逆序对
Another Version of Inversion 题意:只有2种走路方式,往右或者往下,求先走到一个大的数,在走到小的数的这种方式有多少.也就是说求出关于这个2维矩阵的逆序数. 题解:二维数组 ...