1.String类型
上一节我们复习了引用类型,而string正是其中的一个。下面我们来看一段代码:
string str1 = "你好";
string str2 = "你好";
string str3 = new string("你好");
string str4 = new string("你好");
bool b1 = object.Equals(str1, str2);
bool b2 = object.Equals(str3, str4);
bool b3 = object.ReferenceEquals(str1, str2);
bool b4 = object.ReferenceEquals(str3, str4);
上面我们创建了4个字符串,大家先猜一猜b1~b4的结果。
object.Equals是比较两个数据是否相等,而object.ReferenceEquals是比较两个数据是否相同。
很显然,b1~b2是true,而b3是true,b4却是false。那么这是为什么呢?
下面我们引入字符串池的概念:
通过上面的一串描述,我们知道了,字符串在直接赋值的时候会调用字符串池。而上面代码中str1和str2,当str1赋值为“你好”时,字符串池中没有,故赋予了一块内存存放“你好”。当str2同样赋值为“你好”时,字符串池中有相同字符串,故将其直接指向它。而字符串池的作用也显而易见为提高内存利用率。
相反,str3和str4就不一样了,它不会调用字符串池,而是直接在堆中新建了两块地区存放字符串,故它们并不相同。
2.可变字符串
string str1="";
for (int i=0;i<10;i++)
{
str1 += i;
}
StringBuilder str2 = new StringBuilder();
for (int i = 0; i < 10; i++)
{
str2.Append(i);
}
我们看上面的一串代码。之前我们说过字符串池的概念,只要是赋予了新的字符串,就会划出一块内存用于存储。而string简单拼接这样一次循环就要产生很多个垃圾。
这里我们使用stringbuilder可变字符串。
StringBuilder str2 = new StringBuilder(10);
可变字符串虽然可以避免产生垃圾,但是当我们的字符串录入超过原定大小时,可变字符串就会舍弃原有空间,重新复制一份到新空间,就会产生更大的垃圾。所以我们在使用可变字符串时,一般适用于频繁的对字符串进行操作。
用法如上图,而在实例化时,我们如果知道这个字符串有多大,我们可以在括号中加入大小。
相应的一些方法,除了上面的append方法,还有:
而我们string也有很多的方法如下:
具体用法如下:
string str = ",a,bc,dw,xy,z,";
char[] strarr=str.ToCharArray();//将字符串改为单字符数组
string str1=str.Insert(0,"PPP");//在索引为0的地方加入PPP字符串
bool b1=str.Contains('w');//查看字符串是否包含w字符
string strLower = str1.ToLower();//字符串大写
string strUpper = str1.ToUpper();//字符串小写
int strCharFind=str.IndexOf("abc");//返回找到的字串索引
string strSub = str.Substring(2);//这里返回由索引处到结尾的子字符串
string strRemoveComma=str.Trim(',');//去除首位的以某个字符或多个字符为目标的字串,这里我们去除‘,’,默认去除空格(在不传递任何参数时)。
string[] strSplitArr=str.Split(',');//以逗号分割字符串为多个字符串组成的数组中
string strReplace = str.Replace(',', '!');//用新字符代替字符串中的老字符
string strJoin = string.Join('@',new char[] { '1','2'});//返回一串由字符数组与分割符相结合的字符串。
根据上面所学,我们可以尝试一下上面的一些练习。
下面的代码仅供参考:
public static string findRepeatChar(string a)
{
char[] strToCharArr=a.ToCharArray();
int num;
StringBuilder strNew = new StringBuilder(a.Length);
for(int i = 0; i < strToCharArr.Length; i++)
{
num = 0;
foreach(var item in strToCharArr)
{
if (strToCharArr[i] == item)
{
num++;
}
}
if (num == 1)
{
strNew.Append(strToCharArr[i]);
}
}
return strNew.ToString();
}
static void Main()
{
string str = "How are you";
string[] strSplit=str.Split();
Array.Reverse(strSplit);
foreach(var item in strSplit)
{
Console.Write(item + " ");
}
Console.Write("\n");
char[] strToChar = str.ToCharArray();
Array.Reverse(strToChar);
foreach(var item in strToChar)
{
Console.Write(item);
}
Console.Write("\n");
string newstr = findRepeatChar(str);
Console.Write(newstr);
}