上节复习:
字符串_集合
1.值类型与引用类型的区别
储存:
值类型储存在 堆 中
引用类型的对象储存在堆中,而变量储存在栈中;
引用类型 相当于指向同一内存对象的两个变量
值类型 相当于独立的两个对象
2.装箱与拆箱是什么
将其他类型的变量转化为 object 类型为装箱
反之 为拆箱
3.异常是什么?
在执行过程出现的问题
异常实际就是一个类,一个对象
4.多态的实现的方式
父类实现多态 new override
抽象类实现多态 abstract override
接口实现多态
====================================================================
本堂内容:
1.GC 垃圾回收器
.net 应用程序作为一个托管的运行机制,CLR里面有一个极其重要的部分,就是垃圾回收;
01 垃圾回收的目的:
为了防止内存溢出
02 何时回收:
刚刚生成的对象都叫0代
回收一次,那些没有被回收的对象就变成1代,并处理碎片
回收两次,那些没有被回收的对象就变成2代,并处理碎片
没有第3代;超出2代就异常
每一代都有一个内存大小
0代 满了就回收一次 没用的内存被回收,有用的变成1代,而且0代变为空,可以继续装;
同样 1代 满了会再回收一次,2代满了就报异常
03 怎么回收:
当有程序不用时,删除后会会内存留下碎片,系统会对其他应用自动重新排序,把碎片清楚后内存回收
2.异常处理
如何抛出异常?
异常实际就是一个类,一个对象
throw new Exception("异常信息");
异常抛哪儿了?
异常抛给调用它的方法
如果该方法没有处理异常,就再往上抛;
如果做了异常处理,就不再往上抛;
try
{
Func();
}
catch(Exception ex)
{
ConSole.WriteLine(ex.Message);
}
ConSole.ReadKey();
public static void Func()
{
throw new Exception("异常信息");
}
------------------------------------------------------------------
3.字符串
01 字符串的定义方法:
string str = "我是字符串";
char[] chars = {'1','2','si'};
string str1 = new string (chars);
string str2 = new string('c',3);// str2 = "ccc";
02 字符串的数组使用:
字符串有一个很特殊的使用方式,当做数组进行遍历
char[] chs = str.ToCharArray();
chs[0] = '你';
str = new string (chs);
这样 str = "你是字符串";
03 常见的字符串属性与方法:
参考MSDN
参考我的文档
001 字符串比较
ToUpper();转化为大写
ToLower();转化为小写
对于忽略大小写的比较 先转换统一格式 再比较
int string.Compare(str1,str2)
结果: str1 > str2 返回 1
str1 = str2 返回 0
str1 < str2 返回 -1
字符串比较 按字母顺序 a < b < c < ……
大小写:A > a
int res = string.Compare(str1,str2,true) 忽略大小写 如为 false 则 不忽略大小 写
Equals
bool str1.Equals(str2);
bool string.Equals(str1,str2);
bool string.Equals(str1,str2,StringComparison.OrdinalIgnoreCase);
最后一个重载是忽略大小写比较
002 修整 Trim
i 去掉两端空格
string str = " 1111 ";
string str1 = str.Trim();
ii 去掉两端的其他字符
string stemp = "[][1123]][";
string stemp1 = stemp.Trim(']','[');
即得: stemp1 = "1123";
003 合并与分割
i 合并
string[] strs = {"hello","你好","嗨"};
string.Join(分隔符,数组);
string str = string.Join("|",strs);
ii 分割
语法:
string[]str1 = str.Split(需要分割的符号);
例:
string path = @"c:\\windows\system32\1.dll";
string[] paths = path.Split ('\\');
string str = "I am a student how are you !";
string[]strs = str.Split(' ','!');处理后会有空字符
string[] strs1 = str.Split(new char[]{' ','!'},stringSplitOption.RemoveEmptyEntries);
这样处理后 空字符会被删除掉
004 字符串的查找
1. Contains
string str = @"D:\music\孙燕姿_我不难过.mp3";
bool str.Contains("要找的字符串")
bool isRight = str.Contains("孙燕姿");
2. IndexOf
找出来有没有该字符串之外,如果找到,应该给出改字符串的位置;
int str.IndexOf("要查找的东西");
用该方法 找到要查找东西 返回改字符串的位置,找不到就返回-1;
int index = str.IndexOf("孙燕姿");
若同一个字符串中要查找的字符串多次出现 该重载只能查找第一个该字符串出现的位置;
int index = str.IndexOf("孙燕姿",10);
从字符串的下标为10的字符开始查找,找到第一个要查找字符串开始返回;
找出所有的要查找的字符串
int index = -1;
do
{
index = str.IndexOf("孙燕姿",index+1);
if(index !=-1)
{
ConSole.WriteLine(index);
}
}
while ( index !=-1);
特例:
string str2 = "cccccccccccccc";
int index = -1;
do
{
index = str2.IndexOf("cc", index + 1);
if (index!=-1)
{
Console.WriteLine(index);
}
} while (index != -1);
Console.ReadKey();
3. IndexOfAny:
string str = "1b1b2nn3m4n5b6i";
char[]nums = {'1','2','3','4','5','6'};
str.IndexOfAny(nums,1); 即从下标为1开始查找,遇到第一个数组中有的字符开始返回;
LastIndexOf:
从后面开始查找
005 求子字符串
Substring()
1. string str.Substring(index)
返回从index开始到最后的所有部分
string str = @"D:\music\孙燕姿_我不难过.mp3";
int index = path.LastIndexOf('\\');
string temp = path.Substring(index+1);
若index 的数值大于字符串的长度则会异常
2. string str.Substring(index,Length)
string data = "2012年6月29日";
int index = data.IndexOf('月');
string temp = data.Substring(index+1,2);
006 应用实例:走马灯
string str = "我是一个走马灯";
while(true)
{
ConSole.Clear();
string head = str[0].ToString();
string body = str.Substring(1);
str = body + head;
ConSole.WriteLine(str);
System.Threading.Thread.Sleep(200);
}
007 字符串的插入、移除和替换
1.Insert
string str = "013456";
str = str.Insert(2,"2");
结果为 str = "0123456";
2.Remove
string str = "0123456";
str =str.Remove(3);
结果为 str = "012";
str = str.Remove(3,1);
结果为 str = "012456";
3.Replace
string str.Replace("原字符串","新字符串");
string str.Replace('原字符','新字符');
string data = "2012年06月29日";
string temp = data.Replace("年","-").Replace("月","-").Replace("日","");
008 判断开始和结尾
比如检查是否为MP3歌曲
string path = @"d:\123\234\always online.mp3";
bool path.EndsWith(".mp3")
if(path.EndsWith(".mp3"))
{
ConSole.WriteLine("是mp3");
}
else
{
ConSole.WriteLine("不是mp3");
}
同样还有 bool path.startswith("字符串");
009 格式化字符串
string.Format();
//ConSole.WriteLine("{0}{1}{2}={3}",1,"+",2,3);
string str = string.Format("{0}{1}{2}={3}",1,"+",2,3);
与 ConSole.WriteLine()功能很相似;
所不同的是 CW 为输出, Format 为返回;
3. StringBuilder
StringBuilder sb = new StringBuilder();
sb.Append(拼接对象); 追尾添加
sb.AppendLine(拼接对象); 换行添加
sb.AppendFormat(拼接对象);
sb.Clear();清除
4. Equals
bool b = str1.Equals(str2);
class MyClass
{
public int num;
public override bool Equals(object obj)
{
MyClass m = obj as MyClass;
if(m==null)
{
return false;
}
return this.num == m.num;
}
}
main 函数中
MyClass m1 = new MyClass();
m1.num = 10;
MyClass m2 = new MyClass();
m2.num = 10;
bool Isright = m1.Equals(m2);
返回值为 false ;(自己验证为 true )
== 比较对象在内存中的物理地址
string str = "123";
string str2 = "123";
bool Isright = str == str2;
返回 true;
char[]chs={'1','2'};
string str = new string(chs);
string str2 = new string(chs);
bool isright = str==str2;
返回值 true;
因为 字符串拘留池(驻留池);
所有相同的字符串均指向同一内存对象;
一般 新字符串 赋值:string temp = string.Empty;
而
MyClass m1 = new MyClass();
m1,num = 10;
MyClass m2 = new MyClass();
m2.num = 10;
bool Isright = m1.Equals(m2);
返回值为 false ;(自己验证为 true )
疑问:
01 对于引用类型:
什么时候赋值是改指向, 什么时候是改内容
浙公网安备 33010602011771号