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)    收藏  举报

导航