黑马程序员技术交流社区

标题: String a="ab" b="ab" ==与equest的区别 [打印本页]

作者: 宋晓明    时间: 2013-5-6 14:56
标题: String a="ab" b="ab" ==与equest的区别
请问String a="ab"  b="ab"        ==与equest的区别是什么?

作者: zms2100    时间: 2013-5-6 15:06
==是基本运算符,通常比较基本数据类型是否相等、或比较两个对象的引用地址值。
equals则是用于比较两个对象;1、equals是一个方法,String等类继承自Object类得到的方法,是可以被复写的;
2、equals默认比较的是两个对象的地址值(Object类),在String等类中则是被复写了,用于比较两个对象是否相同等等。
作者: $love    时间: 2013-5-6 15:11
String a="ab"  b="ab"
a.equals(b)     返回true       a==b    返回true       ==比较的是引用数据类型的引用的内存地址                        equals比较的是对象里的值
至于这两个问什么相等!
那是因为java对String这个类做了优化    ,当你创建一个String的时候他会先比较你创建的这个值在内存中是否有一样的值,如果有得话就让它引用已经存在的那个内存地址
如果你这样写:
String name=new String("ab");
他就不会判断了,直接在内存中开辟空间了,不会再去判断
这是你用==号返回的就是false
作者: 淡蓝色    时间: 2013-5-6 15:20
==比较值类型的两个值或者引用类型的地址是否相同
equals 比较引用类型的内容是否相同
作者: ZhaoYuBetter    时间: 2013-5-6 15:30
参考网络+ 加上自己的:    ‘ == ’ 操作符是用来比较2个变量的值是否相等;也就是比较变量所对应的内存中所存取的数值是否相同;
     基本数据类型只能使用 == 操作符;
     如果一个变量指向的数据是对象,如:Object obj = new Object(); 变量 obj是一个内存,new Object()是另一个内存,
     变量obj中存储的是对象占用的那块内存的首地址;
     对象类型的变量,要比较2个变量是否指向同一个对象,既要看这2个变量所对应的内存中的数值是否相等,用 == ;
     ‘equals’ 用于比较2个独立对象的内容是否相同,如果一个类没有重写equals方法,将继承Object的equals方法,
     此时比较的就是2个变量是否指向同一个对象,此时 equals和==返回相同的结果;
     实质:"=="和"!="比较的是地址.也可认为"=="和"!="比较的是对象句柄;而equals()比较的是对象内容.
     或者说,"=="和"!="比较的          是"栈"中的内容,而equals()比较的是"堆"中的内容.
     @Test
      public void testEuqals() {
        String str = "we have the technology";
        String str2 = "we have the technology";
        Assert.assertTrue(str.equals(str2));
        Assert.assertTrue(str == str2); // 不推荐使用 == 比字符串
      
        String c = "we have";
        c += " the technology";        // 将生成新的 String 对象
        Assert.assertTrue(str.equals(c));
        Assert.assertFalse(str == c);  // str 与 c是存在不同的内存位置
     }

作者: 一直在路上    时间: 2013-5-6 15:56
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容。
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同
作者: $love    时间: 2013-5-6 17:20
尹桥印 发表于 2013-5-6 16:22
此楼解释得很好呐

谢谢!互相学习!
说的不好请指教!
作者: 黑马-雷钊    时间: 2013-5-6 21:03
==是算数运算符,
而equals是用来比较对象的地址值的。用的不多
作者: 孙金鑫    时间: 2013-5-6 23:17
String a="ab"  b="ab"

“==”,比较的是地址值,equals比较的是内容。

如果“==”,比较的内容是在享元模式中,值在-128~127之间,也是相同的。
作者: 宋晓明    时间: 2013-5-7 09:04
多谢大家的解释,学习了{:soso_e142:}
作者: Sword    时间: 2013-5-7 13:19
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = newObject();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

这是java面试宝典上的经典题目,希望对你有所帮助
作者: 黄玉昆    时间: 2013-5-7 21:30

如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢
作者: 蔚蓝小嗨    时间: 2013-5-7 21:45
==是用来比较引用数据类型的引用的内存地址
equals方法是用于比较两个独立对象的内容是否相同
String a=new String("abc");
String b=new String("abc");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们引用的内存地址是不同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
作者: 白飞金    时间: 2013-5-7 23:47
本帖最后由 白飞金 于 2013-5-8 11:32 编辑

String a="ab";
String b="ab";
String c=new Sting("ab");
System.out.println(aequals(b));  //结果是true,因为a和b都指向"ab"引用
System.out.println(a==c); //结果是false,因为c是新创建的对象,地址值不是指向已经存在的字符串"ab"




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2