快速业务通道

字符串驻留(String Interning)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-04-11

本文将从三个方面(提出问题、分析与解决问题、问题的扩展)来探讨String字符串驻留机制,与大家一起学习。

一、提出问题:

我们先来看看下面的代码:(假设是一道考题)留给我们的答案是:1That is True 2That is False 我们是选择1还是选择2呢?我们没有机会去调试,摆在我们面前的只有是TrueFalse。我们能够肯定Object.ReferenceEquals(“True”,str)==true,便会毫不犹豫地选择答案1,否则选择答案2

   String str=“True”;
   If ( Object.ReferenceEquals(“True”,str)
==true)
        Console.WriteLine(“That
is True”);
   Else
        Console.WriteLine(“That
is False”);

 

你无须紧张也不必担心失去什么,你可以静下心来思考问题。即便你毫无办法,你也有50%的机会选择正确的答案。其实什么样的答案并不重要,最重要的是我们扪心自问自己是否真的知道得到答案的理由。

二、分析与解决问题:

要解决上面的问题,我们不得不对String类型的字符串驻留机制有一个清楚的了解:

我们都知道String类型直接继承自Object,是一个引用类型。但是编译器在处理字符类型的变量时直接用文本常量来表达。编译器会将这些文本常量字符串存放在托管模块的元数据中,然后在运行时使用字符串驻留机制来访问他们。

字符串驻留机制的提出:字符串比较是许多应用程序中常用的操作,也是一个可以极大地损伤系统性能的操作。针对字符串是的恒定性(也就是一个字符串一旦被创建,我们就不可能再将其变长、变短、或者改变其中任何的字符),我们在内存中只存储一个文本常量字符,并且所有对该文本常量字符串的引用都指向该字符串对象,这样便可提高系统性能,节约内存的使用。

分析上面代码:CLR初始化时,它会创建一个内部的散列表,其中的键为字符串,值为指向托管堆中字符串对象的引用。刚开始,该表为空(当然)。当JIT编译器编译方法时,它会在散列表中查找每一个文本常量字符串。在上面的代码中,编译器首先会查找第一个“True”字符串,并且因为它没有找到,它便会在托管堆中构造一个新的String对象(指向该字符串),然后将“True”字符串和指向该对象的引用添加到散列表。接着,JIT编译器在散列表中查找第二个“True”字符串,这一次由于会找到该字符串,所以不会执行任何操作。

代码执行时,它会在第一行发现需要一个“True”字符串引用。于是,CLR便在其内部的散列表中查找“True”,并且会找到它,这样指向先前创建的String对象的引用就被保存在变量str中。当执行到第二行代码时,CLR会再一次在其内部的散列表中查找“True”,并且仍然会找到它。于是,指向同一个String对象的引用会被传递给Object的静态方法ReferenceEquals作为第一个参数,自然该操作将返回true,因此得到答案便是“That is True..

三、问题的扩展(Extends

Object的静态方法ReferenceEqualsString的实例方法Equals比较:

1、 ReferenceEquals只有在两个引用指向同一个对象时才会返回true.

2、 Equals当两个字符串具有同样的字符集时便返回true.

3、 ReferenceEquals执行的效率要高于Equals

String类的两个静态方法允许我们将含有相同字符集的动态字符串变为托管堆中的一个字符对象,从而提升系统性能。

Public static String Intern(String str);

Public static String IsIntern(String str);

Intern方法:接受一个String参数,然后在CLR内部的散列表中查找它。如果能够找到该字符,Intern将返回已经存在的String对象的引用。如果不存在,则添加到CLR内部的散列表中,Intern最后返回自身的引用。(垃圾收集器将可以回收占用内在)

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号