C# 与 java中的String比较
--by comaple 2011-6-15
第一次比较:
Java实现
String str1="123";
String str2="123";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
输出为:
true
true
.Net实现
string str1 = "123";
string str2 = "123";
Console.WriteLine(str1 == str2);
Console.WriteLine(str1.Equals(str2));
Console.ReadKey();
输出为:
分析:
由于String在java和.net中都具有不变性,其实这两个字符串其实指向的是同一个地址空间。大家都知道Equals方法比较的是内容,由于地址相同当然值也相同,故不管是java还是.net返回的都是true。但==却不一样了,在java中String类没有对==运算符重载。那么==即相当于比较两个字符串的地址,而地址又恰恰是相等的故返回true。
而.net中的string类对==运算符做了重载。如果对string对象调用==运算符就相当于调用Equals()方法。故在.net中这两的字符串的内容是相等的,故返回true。
那么既然==运算符在java和.net中有不同的表现怎么证明,下面我们来看一下,第二次比较。
第二次比较
Java实现
String str1="123";
//调用构造方法会创建新实例。
String str2=new String("123");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
输出为:
false
true
.net实现
string str1 = "123";
//调用构造方法会创建新实例。
string str2 = new string(new char[] { '1', '2', '3' });
Console.WriteLine(str1 == str2);
Console.WriteLine(str1.Equals(str2));
Console.ReadKey();
分析
看到了吧,这里体现的很明显,由于String str2=new String("123");返回的是string的是一个新对象,故str2与str1肯定不是同一个实例即指向了不同的地址空间。所以在调用java中==比较的地址时当然返回的是false了。那么.net中有没有比较地址的方法呢,答案是肯定的。那就是ReferenceEquals(object obj1,object obj2)。该方法返回的是两个对象的地址比较。那么让我们在看以下第三次比较吧。
第三次比较
修改.net实现
string str1 = "123";
string str2 = new string(new char[] { '1', '2', '3' });
Console.WriteLine(str1 == str2);
Console.WriteLine(str1.Equals(str2));
Console.WriteLine(ReferenceEquals(str1, str2));
Console.ReadKey();
输出:
分析
看到了吧,这时候是True,True,False即str1和str2已经不是一个对象了通过地址比较可以确认这一点。
补充说明
很多朋友问到.net中的string和String的区别是什么其实这两个类型没有根本区别。解释如下,其中string类型是C#语法的关键字,属于语法直接支持的引用类型。
而String则是.netFramework类库的封装类型。归根结底还是string。但在用VS开发应用程序的时候到底用那个比较好呢?个人觉得其实这个问题不大,对性能的影响可以忽略不计。只是一但你决定用那个了那就整个项目都用一种写法,一保持统一。
不过非要说一个的话,我个人意见倾向于使用String,因为我们用的是VS开发工具,当然要用类库类型啦。