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. 【字符串算法1】 再谈字符串Hash(优雅的暴力)

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...

  2. Python 再谈字符串

    字符串除了要用引号来创建之外,其他和元组一样,不能修改,如果要修改只能用切片或者拼接的方式. 其他的什么乱七八糟的运算符都一样 一些不同 capitalize()-将字符串的第一个字母大写 str1. ...

  3. [VB.NET Tips]字符串连接

    在很多应用场景下我们都需要对字符串进行拼接操作. 在每一次连接字符串时,都要在堆上分配新的内存空间,每一个分配都有一定的消耗. 较长的字符串在堆中分配,对其进行连接操作需要花费很长的时间,先连接小的字 ...

  4. 关于vb编程之字符串连接/拼接的方法与技巧

    在VB中,笔者知道的字符串的拼接方法主要有两种拼接符号,一种为"&"符,另一种则为"+"符 一.其中&连接运算符用于强制将两个表达式作为字符串连 ...

  5. 再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结

    这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理汇总.如果对文中的题目全部了然于胸,觉得对整个angular框架应该掌握的七七八八了.希望志同道合的通知补充 ...

  6. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖

    即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...

  7. 再谈js对象数据结构底层实现原理-object array map set

    如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...

  8. SQL注入的字符串连接函数

    在select数据时,我们往往需要将数据进行连接后进行回显.很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数.在sqli中,常见的字符串连接函数有concat(),group_ ...

  9. 浅谈HTTP中Get与Post的区别/HTTP协议与HTML表单(再谈GET与POST的区别)

    HTTP协议与HTML表单(再谈GET与POST的区别) GET方式在request-line中传送数据:POST方式在request-line及request-body中均可以传送数据. http: ...

随机推荐

  1. es6 个人笔记

           1.package.json==>npm init node_modules==>npm install webpack -D webpack.config.js==> ...

  2. lombok 下的@Builder注解用法

    pom依赖 <dependency> <groupId>org.projectlombok</groupId>            <artifactId& ...

  3. mybatis 中 useGeneratedKeys 和 keyProperty 含义

    MyBatis如何获取插入记录的自增长字段值: 第一步: 在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Ja ...

  4. nginx安装错误:c compiler cc is not found

    今天安装软件nginx的时候遇到的报错:c compiler cc is not found 查了下网上的资料,解决方案也不复杂. 先说明下环境: 服务器:CentOS 7 nginx:2.3.1 原 ...

  5. Web安全开发规范手册V1.0

    一.背景 团队最近频繁遭受网络攻击,引起了部门技术负责人的重视,笔者在团队中相对来说更懂安全,因此花了点时间编辑了一份安全开发自检清单,觉得应该也有不少读者有需要,所以将其分享出来. 二.自检清单 检 ...

  6. 从零开始开发IM(即时通讯)服务端

    好消息:IM1.0.0版本已经上线啦,支持特性: 私聊发送文本/文件 已发送/已送达/已读回执 支持使用ldap登录 支持接入外部的登录认证系统 提供客户端jar包,方便客户端开发 github链接: ...

  7. 关于hashCode方法的作用

    想要明白hashCode的作用,你必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 你知道它们的区别吗?前者集合内的元素是有 ...

  8. 2019nc#7

    题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A String 点击查看 进入讨论 566/3539  通过 B Irreducible Polynomial 点击查看 规律 730/229 ...

  9. HDU-6333 Problem B. Harvest of Apples 莫队

    HDU-6333 题意: 有n个不同的苹果,你最多可以拿m个,问有多少种取法,多组数据,组数和n,m都是1e5,所以打表也打不了. 思路: 这道题要用到组合数的性质,记S(n,m)为从n中最多取m个的 ...

  10. CodeForces 367 C Sereja and the Arrangement of Numbers 欧拉回路

    Sereja and the Arrangement of Numbers 题解: ummm. 在一副图中,如果全部点的度数是偶数/只有2个点是奇数,则能一笔画. 考虑图的点数k为奇数的时候,那么每个 ...