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

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

  C#代码

  

  // 1) string类型
Console.WriteLine("1)");
string s1 = "abc";
string s2 = "abc"; string s3 = new string(new char[] { 'a', 'b', 'c' });
string s4 = new string(new char[] { 'a', 'b', 'c' }); //string s5 = s1;
//string s6 = s3; Console.WriteLine(s1.Equals(s2)); //true
Console.WriteLine(s1 == s2); //true
Console.WriteLine(object.ReferenceEquals(s1, s2)); //true Console.WriteLine(s3.Equals(s4));// true
Console.WriteLine(s3 == s4); //true
Console.WriteLine(object.ReferenceEquals(s3, s4)); //false //Console.WriteLine(object.ReferenceEquals(s5, s1));//true
//Console.WriteLine(object.ReferenceEquals(s6, s1));//false;
//Console.WriteLine(object.ReferenceEquals(s1, s3));//false; // 2) 基本类型
Console.WriteLine("2)");
int i1 = ;
int i2 = ; int i3 = i1; Console.WriteLine(i1.Equals(i2)); //true
Console.WriteLine(i1 == i2);//true
Console.WriteLine(object.ReferenceEquals(i1, i2));//false; // 3) 除string以外的引用类型
Console.WriteLine("3)");
A a1 = new A();
A a2 = new A();
A a3 = a1; Console.WriteLine(a1.Equals(a2));//false
Console.WriteLine(a1 == a2);//false
Console.WriteLine(object.ReferenceEquals(a1, a2));//false
Console.WriteLine(a1.Equals(a3));//true
Console.WriteLine(a1 == a3);//true
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 = ;
int i2 = ; // System.out.println(i1.equals(i2)); //基本类型没有equals()方法
System.out.println(i1 == i2); // 比较值是否相等 ,就是基本类型的等操作 // 3)除String以外的类型
System.out.println("3)");
A a1 = new Main().new A();
A a2 = new Main().new A();
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()来比较。

最新文章

  1. TCP/IP, WebSocket 和 MQTT
  2. UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)
  3. iOS之 HTTP、Socket、TCP的区别(易混
  4. oracle 前滚和回滚
  5. PHP获取日期
  6. 在相同的主机上创建一个duplicate数据库
  7. Golang学习 - strconv 包
  8. Python 学习开发笔记之IO操作
  9. spring3 jsp页面使用<form:form modelAttribute="xxxx" action="xxxx">报错,附连接数据库的spring MVC annotation 案例
  10. sql查询数据库表中重复记录方法
  11. USACO March. 2012
  12. riot.js教程【四】Mixins、HTML内嵌表达式
  13. OAuth2.0学习(1-9)新浪开放平台微博认证-web应用授权(授权码方式)
  14. [ Java面试题 ]多线程篇
  15. spark1.3.x与spark2.x启动executor不同的cpu core分配方式
  16. RMAN-06900 RMAN-06901 ORA-19921
  17. sqlserver count(1),count(*),count(列名) 详解
  18. C#中 property 与 attribute的区别
  19. Java-大数据方向学习和已掌握知识点整理
  20. win10 SVN不能显示图标

热门文章

  1. XAML基础
  2. SQL查询语句 group by后, 字符串合并
  3. git原理图解
  4. 转 cocos2dx内存优化 (之二)
  5. 个人阅读作业 The Last
  6. QQMain
  7. 设计js通用库
  8. Python的lambda表达式
  9. hdu 4521 小明系列问题——小明序列(线段树 or DP)
  10. 为什么要使用Hibernate