zoukankan      html  css  js  c++  java
  • 字符串String类

    1. String类是一个密封类。用关键字sealed修饰;

    2. 字符串的两个特性:

        ·不可变性:string类型变量,一旦声明就表明它是不会被改变的。因此,string中的方法对string类型的变量进行处理之后都需要返回值来接收。比如说:ToUpper()【将字符串转化为大写的形式】ToLower()【将字符串转化为小写形式】。

        那么有这么一种情况和前面说的有点矛盾?

        string s1="abc";

        string s2="x";

        s1=s1+s2;

        Console.WriteLine(s1);//abcx

        这个问题看下面的图:

        对于:str1=str1+str2;先是进行加法,之后就会在内存中开辟一个空间,然后将原来的s1指向新的内存空间。

        ·字符串池:

        所谓的字符串池就是存放一堆字符串的容器。池里面只会存放常量字符串,不会保存变量字符串,因为字符串的不变性,变量会导致不断地产生新的内存空间,而且只有关闭程序之后才会被释放。

        例如:string name="liqianlong"; 常量字符串

            string str=a+b; 变量字符串

    在这里就可以解释下面的问题:

        为什么 string name="liqianlong";

            string name1="liqianlong";是同一个对象?

        因为没创建一个字符串对象就会先去"字符串池"里面查找,如果有,那么直接将该内存空间上面的地址赋给该变量。如果没有,就会重新创建内存空间。这样两个字符串对象的内存地址一样,就成为同一个对象。

    注意

        string a="a";

        string b="b";

        string c="c";

        string s1=a+b+c;

        和 string s1="a"+"b"+"c";

        这个两个是有区别的,string s1=a+b+c;这句话读取的是a、b、c里面的内容,然后将这三个变量相连接。在此过程中,重新开辟了一个空间,用来存放值,并且不会将值存放到字符串池里面。

        而string s1="a"+"b"+"c";会将a、b、c连接之后,回到字符串池里面查找,如果有就会将"abc"所在的内存空间的地址赋给对应的变量,如果没有,就会重新创建一个内存空间,并且将该常量存放在字符串池里面。

     

    3. 怎样将一个变量保存到字符串池里面?

    例如:

        使用string.Intern(xx)方法,作用是先判断字符串池里面有没有该字符串,如果有,那么就返回暂存池中它的引用,如果不存在,那么就向暂存池里面添加该字符串。

        使用string.IsInterned()方法,作用是在暂存池中查找该字符串,如果已经将该字符串添加暂存池里面,那么就返回引用,否则返回nullNothingnullptrnull引用。

            

  • 相关阅读:
    点击其他地方隐藏div
    jquery获得被选中radio的值
    c++几个新特性
    effective c++ (三)
    80X86保护模式及其编程(一)
    Linux内核完全注释之编程语言和环境(二)
    Linux内核完全注释之编程语言和环境(一)
    linux内核完全注释之微型计算机组成结构
    effective c++ (二)
    effective c++ (一)
  • 原文地址:https://www.cnblogs.com/taidou/p/4677966.html
Copyright © 2011-2022 走看看