关于值类型和引用类型比较的问题

今天下午和同事争论了一下关于”==”和”String.Equals”的区别和用法

我们先看一下下面的程序,是从 .NET Framework 帮助文档中找到的,进行了一些调整

using  System;
class  Test 
{
   
public static void Main() 
   
{
      
//定义String变量
      string a = "hello";
      
string b = String.Copy(a);//创建一个新的实例

      
//比较恒定变量和实例字符串的值: 返回为True
      Console.WriteLine(a == b);

      //比较恒定变量和字符串的比较: 返回为True
      Console.WriteLine(a == "hello");
      
      
//a是常量而b是一个实例,所以按照类型比较:返回为False
      Console.WriteLine((object)a == (object)b);

      
//a是常量而b是一个实例,但是使用String.Equals()方法,比较两个对象的值:返回为True
      Console.WriteLine((object)a.Equals((object)b));

   }

}


从上面的代码中,我们应该已经可以非常清楚的知道几种比较的结果是怎么样的。在默认的情况下,是进行的值类型的比较,同样的道理,在JAVA中也有类似的情况。我们看一下下面的代码

class  Equals
{
    
public static void main(String[] args) 
    
{
        String S1 
= new String("Hello");
        String S2 
= new String("Hello");

        System.
out.println(S1=="Hello");//用对象和字符串比较,返回假
        System.out.println(S1==S2);//进行对象比较 返回假
        System.out.println(S1.equals(S2));//进行值比较 返回真
        System.out.println(S1.equals("Hello"));//进行值比较 返回真
    }

}


JAVA和C#有点不同的是,String对象默认是进行实例比较的,如果需要和字符串或者其他对象进行值类型比较就必须用.equals()方法才可以。这也就是为什么在JAVA中进行字符串和变量之间的比较推荐使用.equals()这种方式而不是==这种方式了。

你可能感兴趣的:(引用类型)