黑马程序员技术交流社区
标题: equals和==的区别 [打印本页]
作者: 李维 时间: 2012-8-23 10:19
标题: equals和==的区别
equals和==的区别,总感觉是一个样的阿。。
那个详细帮我解释下哦
作者: 王小刚 时间: 2012-8-23 10:27
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。
equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
作者: 刘源 时间: 2012-8-23 10:30
运算值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
显然,当equals为true时,==不一定为true;
一句话:当比较数字的时候用==号,比如说字节码,虽然2个都可以,但==号显得比较专业。
而比较内容就用equals。
作者: 焦晨光 时间: 2012-8-23 10:50
==两边的对象属于基本类型是,==的作用仅是比较对象的值是否相等
int a=5;
int b=5;
int c=2;
a==b;//true
a==c;//false
==两边的对象属于引用数据类型时,==的作用是判断对象的内存地址是否一致
Person p=new Person()
person p1=p;
Person p2=new Person()
p==p1;//true
p==p2;//false
equals和==的作用是一样的equals是一个方法
它在底层实现的代码为:
public boolean equals(Object obj)
{
return (this == obj);//证明.内部用的就是==符号
}
但是在String类中,String改写了equals方法
使得equals比较的是两个引用变量存储的实际值,而不是内存地址
而==依然比较的是两个引用变量的地址
最后总结:
equals除了在String类中被改写之外
在其他情况下它的作用和==是完全一致的
除非你也改写equals方法
一般情况下你只要注意,如果两个引用变量操作的是String类型的数据
equals和==的区别就是前者比较的是实际值后者比较的是地址值
除了上述情况
你完全可以认为equals和==作用是一样的
作者: 赵伟闯 时间: 2012-8-23 10:56
"equals “方法(是String类从它的超类Object中继承的)检测两个对象是否相等。
"==”分为两个用法
1、比较引用
而在比较引用时,如果引用指向内存中的同一对象,结果为true;
2、比较基本数据类型:
(例如两个是不是同为字符串类型 则返回true)
比较基本数据类型,如果两个值相同,则结果为true ;
作者: 刘学 时间: 2012-8-23 11:00
本帖最后由 刘学 于 2012-8-23 11:02 编辑
关于equals与==的区别从以下几个方面来说:
1如果是基本类型比较,那么只能用==来比较,不能用equals
比如:
publicclass TestEquals {
publicstatic 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是比较内容的。比如:
publicclass TestEquals {
publicstatic void main(String[] args)
{Integer n1 = new Integer(30);
Integern2 = new Integer(30);
Integern3 = 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等也一样。
String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)。
介绍一下String的equals与==用法,请看下面的实例:
publicclass TestEquals {
publicstatic void main(String[] args) {
Strings1 = "123";
Strings2 = "123";
Strings3 = "abc";
Strings4 = new String("123");
Strings5 = new String("123");
Strings6 = 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
}
}
作者: 李维 时间: 2012-8-23 22:11
谢谢,问题已解决!一楼讲得很清楚了,现在我是完成懂了。
作者: 贾飞雨 时间: 2012-8-24 11:30
值类型的比较用==,比如A=3,B=5,A和B等不等比较的是值,而object类型,也就是对象的比较用equals,对象是引用型的,它比较的是对象的引用是不是一样而不是值是不是等,比如O1 o1=new O1();O2 o2=new O2();o1和o2的比较就要用equals了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |