[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应用程序中有大量字符串拼接操作的,可以多使用内置。毕竟处理速度快,能够处理的并发就越高。

原文地址:https://www.cnblogs.com/tengwei6328/p/11415692.html

时间: 2024-11-02 22:55:10

[VB.NET Tips]再谈字符串连接之内置池的相关文章

53 再谈字符串

C语言中,gets() 和scanf()的区别在于输入的字符串是否中间有空格:对于前者,只有遇到"\n"时才停止输入,而对于后者,出现"\n"或空格都停止输入. fgets会认为用户输入的回车也是字符串的一部分,并且会检查是否缓存区溢出.所以最好使用fgets,因为比较安全,但为了保证安全,第二个参数必须正确写入. //scanf("%s", &l_str); gets_s(l_str); //fgets(l_str, sizeof(l_

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

在VB中,笔者知道的字符串的拼接方法主要有两种拼接符号,一种为"&"符,另一种则为"+"符 一.其中&连接运算符用于强制将两个表达式作为字符串连接,重点是强制,即使有一边为字符串,一边为数字类型都可以 如:Label1.Caption="abc" & 123        Label1.Caption="abc" & vbCrLf & "qq5201351"   //

再谈PHP单引号和双引号区别

其实在之前的PHP100视频教程里我就讲过,单引号和双引号的区别和效率问题,但还是很多朋友了解的不是很清楚,一直以为PHP中单引号和双引号是互通的,直到有一天,发现单引号和双引号出现错误的时候才去学习研究.所以今天再拿出来谈谈他们的区别,希望大家不要再为此困惑." " 双引号里面的字段会经过编译器解释,然后再当作HTML代码输出.' ' 单引号里面的不进行解释,直接输出. 从字面意思上就可以看出,单引号比双引号要快了. 例如:     香格里拉娱乐城$abc='my name is t

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

Angular 的数据绑定采用什么机制,详述原理? 脏检查机制.阐释脏检查机制,必须先了解如下问题. 单向绑定(ng-bind) 和 双向绑定(ng-model) 的区别? ng-bind 单向数据绑定($scope -> view),用于数据显示,简写形式是 {{}}. 两者的区别在于页面没有加载完毕 {{val}} 会直接显示到页面,直到 Angular 渲染该绑定数据(这种行为有可能将 {{val}} 让用户看到):而 ng-bind 则是在 Angular 渲染完毕后将数据显示. ng-

JS中三种字符串连接方式及其性能比较

工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符“+”把要连接的字符串连起来: str="a"; str+="b"; 毫无疑问,这种方法是最便捷快速的,如果只连接100个以下的字符串建议用这种方法最方便. 第二种方法  以数组作为中介用 join 连接字符串: var arr=new Array(); arr.push(a); arr.push

JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符

// Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * 这里需要注意 a++ 和 ++a 的区别,后面说; */ /* public class Javase{ public static void main(String[] args){ int a = 10; int b = 20; int c = 30; System.out.println( a

优化java字符串连接与循环

最近在看公司项目的时候,发现前辈们写的代码很少用到字符串通过"+"号拼接,通过看源码发现package java.lang下有StringBuilder这么个类 StringBuilder用起来相当的方便,特别是在拼接SQL的时候看的一目了然. 网上也有说:消除字符串连接,在程序中优先考虑使用StringBuffer或者StringBuilder代替String.一个字符串相当于一个匿名的String对象,如果在程序中拼接两个字符串那么会在内存中定义三个字符串空间.而StringBuf

再谈登陆窗体的测试用例设计要点

再谈登陆窗体的测试用例设计要点 前面我已写过一篇关于登陆窗体的测试用例的文章,自我感觉总有一些不足之处.这篇文章主要是对上篇文章的补充吧 上篇博客的地址:http://blog.csdn.net/haiyan_cf/article/details/41308949 一.登陆界面图展示: 一.从测试用例设计方法的角度考虑: (1)等价类分析法:分为有效等价类和无效等价类. 有效等价类,输入正确的用户名和密码,验证是否能登陆成功. 无效等价类,输入错误的用户名或密码,登陆时是不是能给出合理的提示信息

再谈word2003编程

再谈word2003编程 近期因为项目需要,写了许多word2003编程的东东.有时候遇到难题想查sdk说明,很难找到中文解释,对于e文不好的我来说,简直是天书.想必很多人多有感慨.     下面列出内容是一些常用的内容说明,希望对大家有帮助.     那就开始吧注意,下文的WAPP是我定义的word文档工程变量 的 //合并单元格    table.Cell(2, 2).Merge(table.Cell(2, 3));  //单元格分离     object Rownum = 2;     o