String基本特性

1.String的不可变性:

特性解析:

(1).首先明确:String的组成有两部分:第一部分是在栈中存储的地址信息,用于指向存储实际字符串的地方。

        第二部分是在堆中存储的信息,通过栈中地址来追寻,存储实际要表示的字符串。

(2).String的不可变指的是堆中地址的不可变,即开辟了这块空间并为其赋值后,无法通过String类对这块空间的值进行改变。

(3).当为一个String类进行赋值时,系统会先在字符串池(该池位于堆)中寻找是否已经有对应值的空间,如果有找到,则直接将栈中

 的指针直接指向这个空间,不再重新开辟空间进行赋值。

看以下代码:

1 static void Main()
2         {
3             string name = "张三";
4             name = "李四";
5         }

解析:

(1).第3行即为name这个String类在栈中开辟一块空间用于存储地址,并且在堆中开辟一块空间存储"张三",且栈中存储的地址即为堆中开辟的空间的地址。

(2).第4行改变的是栈中的地址,而不是之前"张三"这块堆空间中的值,即改变了name在栈中的地址,将其指向堆中的另一块地方,并将这块地方存上"李四"。

(3).当程序结束后,GC(垃圾回收器)会发现存储"张三"的这块空间没有对应指针指向,所以会将其当作无用空间进行清理,以节省内存。

1 static void Main()
2         {
3             string name1 = "张三";
4             string name2 = "张三";
5         }

解析:

name1和name2指向同一个堆中的空间区域

 

2.Sting ---- 只读的Char[]数组

特性分析:

(1).通过该特性我们知道可以用下标索引来访问每一个字符元素(如:s[0],s[1])。

(2).但是不能通过索引来改变某一个位置的元素,否则会报错(如:s[0] = 1;//非法指令,系统报错)。

要改变String类的某一个元素的值,可以通过以下方式实现:

 1 static void Main()
 2         {
 3             string test = "abcdefg";
 4             Console.WriteLine(test);
 5             char[] change = test.ToCharArray();
 6             change[0] = 'b';
 7             test = new string(change);//此处一定要以change为参数去开一个String类
 8             //test = change.ToString();会导致产生null类型,无法传入想要的结果
 9             Console.WriteLine(test);
10         }

 

posted @ 2022-03-10 17:14  jue1e0  阅读(60)  评论(0)    收藏  举报