A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘晓康 中级黑马   /  2012-4-1 11:18  /  2484 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

给个详细的解释

15 个回复

倒序浏览
tring a = new String("abc");
String b = new String("abc");
这时: a==b? 值为 false , a.equals(b) 值为 true;
说明:==判断的是内存的指向;equals判断的是对象中的内容.所以判断字符串的值是否相等时通常用的是equals.
回复 使用道具 举报
equals是object类中的共性方法,在不同的类中都被改写,但 大体的作用是比较两个对象的内容是不是一样,比如String a ="abc",String b ="abc".   a.equals(b)结果为ture,比较的是对象的内容,而==比较的是,两个引用是不是指向同一个对象,只有同一个对象是返回ture.
结论:equals两个对象比内容。
        ==是两个引用比对象!
回复 使用道具 举报
equals判断的是对象中的内容.是否相同,用于对象比较,==在基本数据类中是判断是否相等,在引用数据类型中是 比较俩个对象的地址值是否相同
回复 使用道具 举报
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
回复 使用道具 举报
==操作符比较的是两个变量的引用是否是同一个对象,
equal()则是比较这两个变量的值(数据上)是否一样
回复 使用道具 举报
几句话可以说完 但是为这个问题能让你详细理解 特地从网上给你找了篇 解释希望能帮到你   老师 希望能给点分哈
set里的元素是不复能重复的,用iterator()方法来区分重与否。

equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。

==用于比较引用和比较基本数据类型时具有不同的功能:

比较基本数据类型,如果两个值相同,则结果为true



equals 方法是 java.lang.Object 类的方法。
有两种用法说明:

一. 对于字符串变量来说,

使用“==”和“equals()”方法比较字符串时,其比较方法不同。

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同。

比如:

String s1,s2,s3 = "abc", s4 ="abc" ;

s1 = new String("abc");

s2 = new String("abc");

那么:

s1==s2 是 false //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,

故不相等。


s1.equals(s2) 是 true //两个变量的所包含的内容是abc,故相等。



注意(1):

如果: StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");

结果: s1.equals(s2) //是false

解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,

而Object类中的equals方法是用来比较“地址”的,所以等于false.

注意(2):

对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符

串常量所生成的变量,其中所存放的内存地址是相等的,

所以s3==s4是true(即使没有s3=s4这样一个赋值语句)


二. 对于非字符串变量来说,

      "=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

比如:

class A

{

A obj1 = new A();

A obj2 = new A();

}

那么:obj1==obj2是false

obj1.equals(obj2)是false

但是如加上这样一句:obj1=obj2;

那么 obj1==obj2 是true

obj1.equals(obj2) 是true

总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较

其指向的对象是否相同的。

== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。





关于equals与==的区别从以下几个方面来说:

(1) 如果是基本类型比较,那么只能用==来比较,不能用equals

比如:
public class TestEquals {
public static void main(String[] args)
{
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}

(2) 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:
public class TestEquals {
public static void main(String[] args)
{ Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。

(3) 注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这三个类作进一步的说明。
(a)首先,介绍String的用法,请看下面的实例:
public class TestEquals {
public static void main(String[] args) {
String s1 = "123";
String s2 = "123";
String s3 = "abc";
String s4 = new String("123");
String s5 = new String("123");
String s6 = new String("abc");

System.out.println(s1 == s2);//(1)true
System.out.println(s1.equals(s2));//(2)true
System.out.println(s1 == s3);//(3)flase
System.out.println(s1.equals(s3));//(4)flase

System.out.println(s4 == s5);//(5)flase
System.out.println(s4.equals(s5));//(6)true
System.out.println(s4 == s6);//(7)flase
System.out.println(s4.equals(s6));//(8)flase

System.out.println(s1 == s4);//(9)false
System.out.println(s1.equals(s4));//(10)true
}
}

答案解释:s1与s2分别指向由字符串常量”123” 创建的对象,在常量池中,只有一个对象,内容为123,有两个引用s1和s2指向这个对象,故这两个引用变量所指向的地址是相同的,因而(1)处的运行结果为true,又因为s1.equals(s2)是比较s1和s2所指向的对象的内容是否相等,而我们知道这两个对象的内容都是字符串常量”123”,故标记(2)处的运行结果是true。
用同样的方法分析,s1和s3所指向的对象不一样,内容也不一样,故标记(3)和(4)处运行结果是false。
再看看s4和s5,这两个引用变量所指向的对象的内容都是一样的(内容都是123),但是这两个对象是用new操作符创建处类的,是在内存中分配两块空间给这两个对象的,因而这两个对象的内存地址不一样,故事两个不同的对象,标记(5)处的s4 == s5 运行结果为false,但是内容一样,故标记(6)处的s4.equals(s5)运行结果为true。同理,s4和s6所指向的对象地址不同,内容也不相同。故标记(7)(8)处运行结果为false。
s1和s4分别指向两个不同的对象(之所以这样称呼,是因为这两个对象在内存中的地址不相同,故而对象不相同),故标记为(9)处的s1 == s4运行结果为false。



总结:

(1)对字符变量来说:

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同

      (  StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals方法是用来比较“地址”的;

       String类中定义重新定义了equals这个方法,比较的是“值”不是“地址”。)

(2)对非字符变量来说:

  "=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
当用关系运算符“==”比较两个对象时,是比较对象使用的内存地址是否相同,如果两个对象使用的是同一个内存的地址,则结果为true,否则结果为flase
当用对象的equals()方法比较两个对象时,是比较两个对象的内容是否相同而与对象的内存地址无关,如果两个对象的内容相同,则结果为true,否则结果为flase。
回复 使用道具 举报
指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable
回复 使用道具 举报
==用于比较两个表达式的值是否相等,如果比较的二者为引用型变量,则比较的是这两个引用型变量是否指向同一个对象,是同一个对象则为true,否则为flase.
而equals是一个方法,它可以被复写,它的具体功能由它的方法体决定,通常用于比较两个对象的内部数据是否相等,如String类的equals方法用于比较两个字符串的值是否相等。可以自定义一个类复写equals方法,这样它的作用就由你决定。
equals方法是所有类的超类Object类中的一个方法。
回复 使用道具 举报
==是判断地址。。。equals,要看你调用这个方法的对象有没有重写了Object的equals方法。。如果没有,比较的也是地址。。如果重写了,就得看你重写了之后是怎么比较的。。字符串时比较两个字符串的内容是否相同。。。
回复 使用道具 举报
==不能对对象进行比较,但是可以比较对象的地址值、常量和变量。而equals是对象进行比较的,也就是说对对象中的成员进行比较。
回复 使用道具 举报
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但是,String a=new String("abc");
String b=new String("abc");
a==b将返回false。
对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new,意味着将在内存中产生两个内容为"abc"的字符串,既然是,两个,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用==,结果会是false。a和b所指的对象,它们的内容都是"abc",应该是所谓的,相等,但是==操作符并不涉及到对象内容的比较。 对象内容的比较,使用equals方法。
jdk中Object对象的equals方法的实现:
  public boolean equals(Object obj) {
        return (this == obj);
    }
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。
比较两个对象内容是否相等,要类的创建者自己设计而不是依靠Object的equals方法。
回复 使用道具 举报
      ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
回复 使用道具 举报
        equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
        String a=new String("foo");
        String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
回复 使用道具 举报
可不可以简单说成是
equals比较的是独立 对象 的内容
==比较的是基本类型数据或两个变量
String s1=new String("aaa");
String s2=new String("aaa");比如这俩比较用==就返回false   用equals就返回ture
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马