zoukankan      html  css  js  c++  java
  • C#与Java中相等关系

      最近在学习java的语法,发现java中两个字符串某些情况下不能用==这个来判断,比如自己定义的类中有String属性,那么就不能用==判断两个是否相等。这才开始比较C#和Java在这里的区别,最后发现区别不大,只有一个地方有一点区别。

      一。C#中Equals(),==区别

      C#代码

      

     1  // 1) string类型
     2             Console.WriteLine("1)");
     3             string s1 = "abc";
     4             string s2 = "abc";
     5 
     6             string s3 = new string(new char[] { 'a', 'b', 'c' });
     7             string s4 = new string(new char[] { 'a', 'b', 'c' });
     8 
     9             //string s5 = s1;
    10             //string s6 = s3;
    11 
    12             Console.WriteLine(s1.Equals(s2)); //true
    13             Console.WriteLine(s1 == s2); //true
    14             Console.WriteLine(object.ReferenceEquals(s1, s2)); //true
    15 
    16             Console.WriteLine(s3.Equals(s4));// true
    17             Console.WriteLine(s3 == s4); //true
    18             Console.WriteLine(object.ReferenceEquals(s3, s4)); //false
    19 
    20             //Console.WriteLine(object.ReferenceEquals(s5, s1));//true
    21             //Console.WriteLine(object.ReferenceEquals(s6, s1));//false;
    22             //Console.WriteLine(object.ReferenceEquals(s1, s3));//false;
    23 
    24             // 2) 基本类型
    25             Console.WriteLine("2)");
    26             int i1 = 10;
    27             int i2 = 10;
    28 
    29             int i3 = i1;
    30 
    31             Console.WriteLine(i1.Equals(i2)); //true
    32             Console.WriteLine(i1 == i2);//true
    33             Console.WriteLine(object.ReferenceEquals(i1, i2));//false;
    34 
    35             // 3) 除string以外的引用类型
    36             Console.WriteLine("3)");
    37             A a1 = new A(10);
    38             A a2 = new A(10);
    39             A a3 = a1;
    40 
    41             Console.WriteLine(a1.Equals(a2));//false
    42             Console.WriteLine(a1 == a2);//false
    43             Console.WriteLine(object.ReferenceEquals(a1, a2));//false
    44             Console.WriteLine(a1.Equals(a3));//true
    45             Console.WriteLine(a1 == a3);//true
    46             Console.WriteLine(object.ReferenceEquals(a1, a3));//true

      

      string虽然是引用类型,但是微软设计得表现成基本类型一般,所写了Equals()方法和重载了==,!=运算符所以两个string之间的Equals()与==操作完全同值类型的操作。所以上面代码的1)和2)种情一样。

      

      string还有一点特殊的是像上面的

      s1="abc";

      s2="abc";

    这两个是指向同一个对象的引用,这是一个string驻留池里的空间,下面的

      string s3 = new string(new char[] { 'a', 'b', 'c' });

      string s4 = new string(new char[] { 'a', 'b', 'c' });

    这两上则是完全像我们定义类一样,在堆中分配了两块不同的区域,所以ReferenceEquals()比较是false,有个可以有觉得这里奇怪了,那为么Equals()和==这两个比较的结果是true呢?这个可以通过看微软元数据(F12跳入)查看到string这个类是重写了Equals()方法和==运算符。

      上面说了基本类型同string,下面是引用类型了,这个在没有重写的情况下很简单可以看出结果,三种操作都是判断是否是同一个对象的引用。其实平时我们写类可以重写一下Equals()来实现我们类中属性相等的判断。

      

      Java代码

            // equals()比较的是值是否相等 ==比较的是否是同一个对象的引用
            // 1)String类型
            System.out.println("1)");
            String s1 = "abc";
            String s2 = "abc";
    
            String s3 = new String("abc");
            String s4 = new String("abc");
    
            System.out.println(s1.equals(s2));//true
            System.out.println(s1 == s2);//true 同一个对象的引用
    
            System.out.println(s3.equals(s4));//true
            System.out.println(s3 == s4);//false 不同的对象引用
    
            // 2)基本数据类型
            System.out.println("2)");
            int i1 = 10;
            int i2 = 10;
    
            // System.out.println(i1.equals(i2)); //基本类型没有equals()方法
            System.out.println(i1 == i2); // 比较值是否相等 ,就是基本类型的等操作
    
            // 3)除String以外的类型
            System.out.println("3)");
            A a1 = new Main().new A(10);
            A a2 = new Main().new A(10);
            A a3=a1;
            
            System.out.println(a1.equals(a2));//false
            System.out.println(a1==a2);//false
            
            System.out.println(a1.equals(a3));//true
            System.out.println(a1==a3);//true

      Java中的equals()和== 其实在java中的存储结构同C#中没有什么区别,string也是有字符串池,只是java中的String类没有重载==运算符,所以结果安上面C#的方法推出结果完全一致

      总结:Java与C# 都有string类型,都有驻留池,Java叫字符串池;C#重载了==运算符,Java没有重载(就这里的区别)。所以C#中比较字符串常用==,Java中常用equals()来比较。

  • 相关阅读:
    中国年薪 ¥30 万和美国年薪$ 10 万的生活水平异同
    汽车之家CMDB设计思路 – 汽车之家运维团队博客
    平民软件 | 中间件
    FIT2CLOUD
    ZeroBrane Studio
    新炬网络-领先数据资产运营商 | 数据资产管理 | 数据库运维 | 自动化运维
    中国(南京)软件开发者大会
    夏仲璞 | 全球软件开发大会北京站2016
    Nginx下流量拦截算法 | 夏日小草
    docker~dockertoolbox的加速器
  • 原文地址:https://www.cnblogs.com/gw2010/p/3452679.html
Copyright © 2011-2022 走看看