[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: ...
随机推荐
- 常用Feed流架构实现
业务中很多需求都会用到类似feed流的架构. 例如 微信朋友圈 微博 动态 1对N消息. 一般feed流的架构实现有下面几种. 假如现在的业务场景是微博,然后当前的数据情况是: 用户A关注了用户B和C ...
- 关于C#中的“?”
目录 1. 可空类型修饰符(T?) 2. 三元(运算符)表达式(?: ) 3. 空合并运算符(??) 4. NULL检查运算符(?.) 关于C#中的"?" shanzm-2019年 ...
- 消息中间件——RabbitMQ(七)高级特性全在这里!(上)
前言 前面我们介绍了RabbitMQ的安装.各大消息中间件的对比.AMQP核心概念.管控台的使用.快速入门RabbitMQ.本章将介绍RabbitMQ的高级特性.分两篇(上/下)进行介绍. 消息如何保 ...
- 从一道没人能答对的面试题聊聊Java的值传递
这是一道我们公司的面试题,从招第二个Java以来就一直存在了.但是面试了这么长的时间还没有一个人可以全部答对,让我们一度以为是这题出的不对.首先请看面试题. 以下运算的输出分别是多少: ```java ...
- HBase 系列(十)—— HBase 的 SQL 中间层 Phoenix
一.Phoenix简介 Phoenix 是 HBase 的开源 SQL 中间层,它允许你使用标准 JDBC 的方式来操作 HBase 上的数据.在 Phoenix 之前,如果你要访问 HBase,只能 ...
- SpringBoot 动态配置邮箱发件人
SpringBoot 动态配置邮箱发件人 现在的消息模块少不了邮件发送.短信发送和手机推送的功能.邮件发送的功能历史最为悠久,也算的上烂大街的功能.一般在配置文件中设置好邮箱地址.账号.密码和发件服务 ...
- 良许 | 命令的输出不会保存?居然连 tee 命令都不会用!
很多情况下,我们需要保存程序/命令的输出到本地,常用的一种方法是重定向,这也是一种很好的方法.但有个问题,如果你想要做后续操作,比如要统计输出的行数等,重定向就有困难了. 这时候,tee 命令就派上用 ...
- CodeForces 909D
题意略. 思路: 将字符分桶,然后暴力去扫,扫完合并.假设有k个桶,每个桶里有n / k个数,那么我们应该要扫 n / (2 * k)次,每次的复杂度是k,最后算得复杂度是O(n). 详见代码: #i ...
- Java基础之Collection与Collections浅析
Java基础之Collection与Collections浅析 一.前言: 位于Java.util包下的Collection与Collections都是Java中重要的工具类,它们都是Java集合框架 ...
- ES5新增数组方法测试和字符串常见API测试
首先是ES5新增数组方法测试: <!DOCTYPE html><html lang="en"><head> <meta charset=& ...