C#与Java对比---之001【有关字符串的“==”和“Equals”的比较】
按照本人博客惯例,首先爆出结论:
C#和Java中有关字符串的“==”和“Equals”的处理是不同的。
首先,Java:
1 public static void main(String[] args){ 2 String s1 = "Chen Chong"; 3 String s2 = "Chen Chong"; 4 5 //输出true 6 System.out.println(s1 == s2); 7 //输出true 8 System.out.println(s1.equals(s2)); 9 10 String s11 = new String("Chen Chong"); 11 12 //输出false 13 System.out.println(s1 == s11); 14 //输出true 15 System.out.println(s1.equals(s11)); 16 }
在代码的注释中已经给出了各个判断语句的结果,此处重点分析结论:
a、“==”对比的是两个变量的地址(即s1和s2的地址),由于s1和s2的声明方式,s1和s2都在栈里面,而且当s2进栈时候会首先在栈里寻找,要是已经存在相同内容的对象,则这两个对象指向同一地址,而不用在栈内新增元素,所以s1和s2对比时候由于地址相同故结果为true,s1和s11由于地址不同(s1在堆,s2在栈)故结果为false。
b、“equals”对比的是两个变量的内容,所以即使用new操作出来的在堆里面的对象s11,由于内容相同,所以结果还是true。
其次,C#:
static void Main(string[] args) { string s1 = "Chen Chong"; string s2 = "Chen Chong"; //输出true Console.WriteLine(s1 == s2); //输出true Console.WriteLine(s1.Equals(s2)); char[] a = new[] { 'C', 'h', 'e', 'n', ' ', 'C', 'h', 'o', 'n', 'g' }; string s11 = new string(a); //输出true Console.WriteLine(s1 == s11); //输出true Console.WriteLine(s1.Equals(s11)); }
继续终端分析结论:
从输出结果可以判断,“==”和“Equals”均是对两个变量内容的比较,所以所有输出结果都为true。
结论:
Java中,字符串的比较“==”是对两个变量的地址的比较,而“equals”是对两个变量的内容的比较。
C#中,字符串的比较“==”和“Equals”都是对两个变量的内容的比较。
扩展:
由于引发的一个另外一个值得探索的问题,引用类对象,这两个操作针对两种语言的区别如何呢?
首先,Java:
1 public static void main(String[] args){ 2 3 Student st1= new Student(); 4 st1.setName("Chen Chong"); 5 6 Student st2 = new Student(); 7 st2.setName("Chen Chong"); 8 9 //输出fasle 10 System.out.println(st1 == st2); 11 //输出false 12 System.out.println(st1.equals(st2)); 13 }
可见,C#针对非字符串类型的引用类型,"=="和"Equals"均比较的是两个变量的引用地址,而不再是内容。
其次,C#:
1 static void Main(string[] args) 2 { 3 Student st1 = new Student(){Name = "Chen Chong"}; 4 Student st2 = new Student(){ Name = "Chen Chong" }; 5 6 //输出false 7 Console.WriteLine(st1 == st2); 8 //输出false 9 Console.WriteLine(st1.Equals(st2)); 10 }
可见,Java针对非字符串类型的引用类型,"=="和"Equals"均比较的是两个变量的引用地址,而不再是内容。
结论:
Java和C#中,针对非字符串类型的引用类型,"=="和"Equals"都是比较的是两个变量的引用地址,而不再是内容。
posted on 2016-03-31 12:31 chenchongsky777 阅读(551) 评论(0) 收藏 举报
浙公网安备 33010602011771号