黑马程序员技术交流社区
标题:
求助,小问题
[打印本页]
作者:
@ne_pie尒ce
时间:
2013-11-7 11:04
标题:
求助,小问题
对于字符串与非字符串来说,==与equals有什么区别?
作者:
敗唫①輩ふ
时间:
2013-11-7 11:09
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
显然,当equals为true时,==不一定为true;
作者:
FFF
时间:
2013-11-7 11:31
本帖最后由 FFF 于 2013-11-7 11:36 编辑
一个对象名实际是一个指针
==比较的是两个指针是否指向同一个地址
equals比较的是两个指针指向的地址中的内容
写了一个小例子来帮你理解。先不要运行,看看你是否能做得出来。如果你的答案和运行的结果一样,就已经很好了!
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
String e = a;
String f = a+"";
System.out.println("a==b为"+(a==b));
System.out.println("a.equals(b)为"+a.equals(b));
System.out.println("a==c为"+(a==c));
System.out.println("a.equals(c)为"+a.equals(c));
System.out.println("c==d为"+(c==d));
System.out.println("c.equals(d)为"+c.equals(d));
System.out.println("e==a为"+(e==a));
System.out.println("e.equals为"+e.equals(a));
System.out.println("a==f为"+(a==f));
System.out.println("a.equals(f)"+a.equals(f));
System.out.println("c==f为"+(c==f));
System.out.println("c.equals(f)为"+c.equals(f));
}
复制代码
就目前来说,字符串与非字符串中比较两个对象的时候==与Equals没有显示的区别。
但是在很多方法中,Equals就有区别,所以有时候不同的方法中就有要求对Equals重载。
作者:
魏-玉-彪
时间:
2013-11-7 12:16
package java131107;
/*
*
* 对于字符串与非字符串来说,==与equals有什么区别?
*
* */
public class Equals {
public static void main(String[] args) {
int ia = 3;
int ib = 3;
int ic = 5;
String s1 = "string";
String s2 = "string";
String s3 = "String *********";
String s4= new String("string");
Can ca1 = new Can("Can 1");
Can ca2 = new Can("Can 2");
Can ca3 = new Can("can1");
System.out.println("整数的对比********************");
System.out.println("ia==ib " + (ia == ib)); // true 基本数据类型只比较值
System.out.println("ia==ic " + (ia == ic)); // false 相等为真
// 整数无equals法对比 System.out.println("ia equals ib "+(ia.equals(ib));
System.out.println("字符串的对比********************");
System.out.println("s1==s2 " + (s1 == s2)); //true 对引用型数据比较地址值 同一个内地址
System.out.println("s1==s3 " + (s1 == s3)); //false 不同的地址
System.out.println("s1==s4 " + (s1 == s4)); //false 不同的内存地址
System.out.println("s1 equals s2 " + s1.equals(s2)); //true 内容相同
System.out.println("s1 equals s3 " + s1.equals(s3)); //false 同容不同
System.out.println("s1 equals s4 " + s1.equals(s4)); //true 内容不同
System.out.println("类对象的对比********************");
System.out.println("ca1==ca2 " + (ca1 == ca2)); //false 地址不同
System.out.println("ca1 equals ca2 " + ca1.equals(ca2));//false 地址不同
System.out.println("ca1==ca2 " + (ca1.equals(ca2))); //false 地址不同
System.out.println("ca1 equals ca3 " + ca1.equals(ca2)); //false 地址不同
ca1 = ca2;// 把 c2的引用给了才c1;
System.out.println("ca1==ca2 " + (ca1 == ca2)); //true 同一个对象,相同
System.out.println("ca1 equals ca2 " + (ca1.equals(ca2))); //true 同一个对象
}
}
class Can{ //定义一个类
String s;
public Can(String classname) {
this.s=classname;
System.out.println("类ca****"+classname);
}
<font size="4">}</font>
复制代码
结论:
==:
1对于
基本数据类型
比较的是
值的大小
,
2 对于
引用数据类型
比较的是
内存地址
equals()方法:
1 是一个方法,所以
不用于基本数据类型的比较
2equals()比较的是
引用数对象(包括类和数组等)
的地址值
,但是
String类重写了equals()方法
,
所以比较的
是内容
3对于没有重写equals()方法的类,比较的仍是 地址值
作者:
零下五度的水
时间:
2013-11-7 13:01
你可以找到你的jdk,从里面找到src.zip,解压保存一下,这个是java的源码,
你看看 java.lang.Object 的equals是怎么实现的,
然后再看看 java.lang.String 的equals是怎么重写的,
你就会豁然开朗了
作者:
黄炳期
时间:
2013-11-7 13:47
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2