请问进行比较时,equal和==到底有何区别? equals方法比较的是内容是否相同==比较的是:需要比较的内容是否在内存中同一个位置。内容相同的不一样存在内存中的同一个位置,但是存在同一个位置的内容肯定相同。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 equals用来比较的是对象是否相同(类型、属性值)==用来比较的比较数值是否相同(例如int、char等非对象类型)如果对对象用==这会比较这两个对象是否是同一个对象(可以认为处在同一内存的物理地址相同) "==" 判断符号左右两个变量(object)是否指向同一内存地址"equals()" 判断两个object是否 “一样” (所有成员值一样...)例如:1)String a = "abc";String b = "abc";a==b //true;a.equals(b) //true;----------2)String a = new String("abc");String b = new String("abc");a==b // false!!!!!!!!a.equals(b) //true在例1中, “abc"是放在常量池(constant pool)里头的,所以,虽然a,b都“=”“abc”但是内存中只有一份copy,所以“==”返回true但是例2中,new方法决定了 两个不同的string “abc”被创建放在了内存heap区,分别被a和b所指向,因此,“==”返回了false!在写自己的类事,必须override equals方法,自己定义什么叫相等(一般是关键成员相等)用词不准确的地方请高手指出更正 可以看看<<Practical Java>> 侯捷翻译的,很不错的一本书.里面这方面问题分析很细致 对于primitive type只能用==比较对于对象实体如String str1 = new String("Hello,world!");String str2 = new String("Hello,world!");HashMap hm1 = new HashMap();HashMap hm2 = new HashMap();可以用==也可以用equals(),意义不一样因为每个对象实体使用reference引用,==实际去比较reference的地址(类似于指针的地址)equals()是基类Object定义的一个方法,用于同一类型之间的比较,你可以override,自己定义比较两个对象的规则。String的equals方法里定义的规则是字符串相同,equals()就返回true所以以上str1==str2返回false(因为显然他们地址不一样)str1.equals(str2)返回true,因为它们的字符串内容相同 程序运行时会有栈空间与堆空间,栈中存放的是地址引用、类型信息、域信息等,堆中存放的是对象的实体。如: Object a = new Object();a会存放在栈中,地址指向堆中Object的实体。==则是比较栈中的地址;equals则是比较堆中存放的实体内容。 equals方法比较的是内容是否相同==比较的是:需要比较的内容是否在内存中同一个位置。内容相同的不一样存在内存中的同一个位置,但是存在同一个位置的内容肯定相同。????????这句话有问题哈 对于==,有人说是比较内存中的同一个位置,有人说是比较值,有人又说对primitive type比较值,对其他比较内存位置,呵呵,好复杂.如果你要实现这个机制会不会弄得这么复杂?事实上,==就是比较值对于primitive type, a,b两快内存中放的就是数值,所以相同就返回真对于非primitive, a,b实际上存放的是它所引用对象的内存地址,所以还是比较的值,指向相同的内存地址的话,就返回真 对于对象是比较内存位置啦对于primitive type,只能用==吧?对象才有equal方法 ==是java语法的一部分,equals是一个方法而已。==很简单,对于primitive类型,比较值;对于对象,比较reference的指向的地址(除了这个好像想不出还能拿什么来比较) ==连接基本数据类型的情况就不说了。如果==连接的是对象变量,那么实际上是通过比较对象所占内存堆的物理地址是否相同来确定两个对象变量是否是引用的同一个对象。而用方法equals就不一样了,完全依赖于这个方法的具体实现。就算引用的是不同的对象,甚至于是不同类的对象,返回的结果也可能是true。 对于primitive type则是在栈中存放相应的值其实对于每一个identifier都要存放它的名字、类型、值、域的信息按栈、堆来理解这两个比较,则可以知道==比较的是栈中内容,equal比较的是堆中内容对于各种类型都可以统一理解。 ==比较的是对象的引用equal()是OBJECT的默认方法,默认比较的也是对象的引用,可以改写此方法来比较对象的内容 equals()是一个方法,至于比较的是内容还是地址,就看你怎么实现了;Object类的equals()方法,内部实现是比较地址;因此如果你声明一个类class Student{...},不对equals()重载,那么调用equals()方法时,仍然比较地址。String类的equals()方法,内部实现是比较字符串的内容;J2SE中的基础类基本上都对继承Object的equals()方法进行了重载,实现内容的比较。至于==一定是比较地址,(想一想,Java中是 不允许对运算符重载的。) jtree与jtextpane的同步 为什么无法找到资源文件? createImage怎么挖出一张大png图中的一个小图像 js可以返回当前页吗? 不小心在方法中定义了static变量,由此想问个问题 看看这个可以实现吗 Ant 如何删除某个动态命名的文件夹? 请问如何得到两个日期之间相差的天数?? How to "executeQuery("select * from 系 where 系名='计算机系'");" In an Application! java什么编译工具最好? 支持SWT!!!!来说说吧,好像每人说这个。 小弟不才初学java
==用来比较的比较数值是否相同(例如int、char等非对象类型)
如果对对象用==这会比较这两个对象是否是同一个对象(可以认为处在同一内存的物理地址相同)
"equals()" 判断两个object是否 “一样” (所有成员值一样...)
例如:
1)
String a = "abc";
String b = "abc";
a==b //true;
a.equals(b) //true;
----------
2)
String a = new String("abc");
String b = new String("abc");
a==b // false!!!!!!!!
a.equals(b) //true
在例1中, “abc"是放在常量池(constant pool)里头的,所以,虽然a,b都“=”“abc”
但是内存中只有一份copy,所以“==”返回true
但是例2中,new方法决定了 两个不同的string “abc”被创建放在了内存heap区,分别被a和b所指向,因此,“==”返回了false!在写自己的类事,必须override equals方法,自己定义什么叫相等(一般是关键成员相等)用词不准确的地方请高手指出更正
对于对象实体
如
String str1 = new String("Hello,world!");
String str2 = new String("Hello,world!");HashMap hm1 = new HashMap();
HashMap hm2 = new HashMap();
可以用==也可以用equals(),意义不一样
因为每个对象实体使用reference引用,==实际去比较reference的地址(类似于指针的地址)equals()是基类Object定义的一个方法,用于同一类型之间的比较,你可以override,
自己定义比较两个对象的规则。String的equals方法里定义的规则是字符串相同,equals()就返回true
所以以上str1==str2返回false(因为显然他们地址不一样)
str1.equals(str2)返回true,因为它们的字符串内容相同
堆中存放的是对象的实体。如: Object a = new Object();
a会存放在栈中,地址指向堆中Object的实体。
==则是比较栈中的地址;
equals则是比较堆中存放的实体内容。
==比较的是:需要比较的内容是否在内存中同一个位置。内容相同的不一样存在内存中的同一个位置,但是存在同一个位置的内容肯定相同。????????这句话有问题哈
事实上,==就是比较值
对于primitive type, a,b两快内存中放的就是数值,所以相同就返回真
对于非primitive, a,b实际上存放的是它所引用对象的内存地址,所以还是比较的值,指向相同的内存地址的话,就返回真
对于primitive type,只能用==吧?对象才有equal方法
其实对于每一个identifier都要存放它的名字、类型、值、域的信息
按栈、堆来理解这两个比较,则可以知道==比较的是栈中内容,equal比较的是堆中内容
对于各种类型都可以统一理解。
equal()是OBJECT的默认方法,默认比较的也是对象的引用,可以改写此方法来比较对象的内容
Object类的equals()方法,内部实现是比较地址;
因此如果你声明一个类class Student{...},不对equals()重载,那么调用equals()方法时,仍然比较地址。
String类的equals()方法,内部实现是比较字符串的内容;J2SE中的基础类基本上
都对继承Object的equals()方法进行了重载,实现内容的比较。
至于==一定是比较地址,(想一想,Java中是 不允许对运算符重载的。)