C#与Java中相等关系
最近在学习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()来比较。
C#与Java中相等关系的更多相关文章
- java中继承关系学习小结
继承:把多个类中同样的内容提取出来.定义到一个类中,其它类仅仅须要继承该类.就能够使用该类公开的属性和公开的方法. 继承的优点:提高代码的复用性.提高代码的可维护性.让类与类之间产生关系,是多态存 ...
- C++/Java中继承关系引发的调用关系详解
C++: 这里引用到了 http://blog.csdn.net/haoel/article/details/1948051/ 中的内容,还请提前阅读陈大神的这篇博客后在阅读本篇. 覆盖,实现多态的基 ...
- Java中一对多映射关系
通过栗子,一个人可以有多辆汽车 定义人 这个类 人可以有很多辆汽车,类中车属性用数组 class Person{ private String name; private String phone ...
- java中变量关系
- 028、Java中的关系运算符
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 024 01 Android 零基础入门 01 Java基础语法 03 Java运算符 04 关系运算符
024 01 Android 零基础入门 01 Java基础语法 03 Java运算符 04 关系运算符 本文知识点:Java中的关系运算符 关系运算符
- Java中内存中的Heap、Stack与程序运行的关系
堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题:堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己动 ...
- java中paint repaint update 之间的关系
最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲.但是他们之间是怎么来调用的呢,咱 ...
- Java中的集合类型的继承关系图
Java中的集合类型的继承关系图
随机推荐
- [SAP ABAP开发技术总结]结构复用(INCLUDE)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [Effective Java]第四章 类和接口
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Linux中变量#,@,0,1,2,*,$$,$?的含义
$# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该shell脚本的第一个参数 $ 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向 ...
- 关于JAVA中URL传递中文参数,取值是乱码的解决办法
前几天看到有网友在问URLDecoder和URLEncoder方面的使用问题,突然想起,原来我刚遇到这两个类时,也觉得很神密,由此可以想想初学者的心情,于是便有了今天的这篇文章. 其实,这两个类的使用 ...
- [转载] 如何使用Lex/YACC
原文: http://segmentfault.com/a/1190000000396608?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...
- Docker-创建支持ssh服务的镜像
这里测试tomcat镜像安装ssh服务 1.启动镜像 [root@wls12c docker]$ docker run -d tomcat:centos 844bdde121a03174f3abd22 ...
- TCP/IP,Http,Socket,XMPP的区别
大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用 ...
- 网络粘贴---Xcode中可用到的快捷键
快捷键: 1.StoryBoard技巧 当你想直接在view中选择自己想要的元素时,但是又碍于一个view上叠加的元素太多很难直接选中,那么在这时,你同时按住键盘上的shift和 control键,然 ...
- D3.js 弦图的制作
这是一种用于描述节点之间联系的图表. 1. 弦图是什么 弦图(Chord),主要用于表示两个节点之间的联系. 两点之间的连线,表示谁和谁具有联系: 线的粗细表示权重: 2. 数据 初始数据为: var ...
- HBase集群搭建
HBase集群搭建 搭建环境:假设我们的linux环境已经准备好,包括网络.JDK.防火墙.主机名.免密登录等都没有问题,而且一定要有zookeeper.下面我们用3台linux虚拟机来搭建Hbase ...