class A{
int a=1;
}
public class equalTest{
public static void main(String[] args) {
A obj1=new A();
A obj2=new A();
String s1,s2,s3="abc",s4="abc";
s1=new String("abc");
s2=new String("abc");
System.out.println("s1=s2?"+(s1.equals(s2)));
System.out.println("s1=s3?"+(s1==s3));
System.out.println("s1=s3?"+(s1.equals(s3)));
System.out.println("s3=s4?"+(s3==s4));
System.out.println("s2=s3?"+(s2.equals(s3)));
System.out.println("s2=s4?"+(s2.equals(s4)));
System.out.println("obj1=obj2?"+(obj1.equals(obj2)));
System.out.println("s1=s2?"+(s1==s2));
obj1=obj2;
System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1.equals(obj2)));
System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1==obj2));
}
}
结果:
s1=s2?true
s1=s3?false
s1=s3?true
s3=s4?true
s2=s3?true
s2=s4?true
obj1=obj2?false
s1=s2?false
obj1=obj2 after obj1=obj2 ?true
obj1=obj2 after obj1=obj2 ?true
问题:
- 书上写到对于同一类的对象,==和equals方法返回值都是false。那么s3.s4是否是同一类的对象呢?如果是,那么灰色标识出来地方结论就不对了。如果不是那又算是什么?
解答:记住一句话:引用永远放在栈上,而对象永远动态分配在堆上。
关于==和equals的区别其实深入到技术细节就是栈地址和堆地址的判断。
学JAVA你要搞清楚什么是简单的数据类型和什么是对象。
记住,在java中String就是一个类。
==和equals的区别:
==用来判断引用地址是否相同,即判断是否引用(指针)指向同一个堆中的对象
而equals是判断对象内的数据是否相同,而不是地址了(不是指针指向的地址)。
System.out.println("s1=s2?"+(s1.equals(s2)));这个清楚了吧,内容相同为true
System.out.println("s1=s3?"+(s1==s3));地址不同啊,为false
System.out.println("s1=s3?"+(s1.equals(s3)));内容相同为true
System.out.println("s3=s4?"+(s3==s4));这里还是有些问题,那位大哥给我说一下。
System.out.println("s2=s3?"+(s2.equals(s3)));内容相同为true
System.out.println("s2=s4?"+(s2.equals(s4)));内容相同为true
System.out.println("obj1=obj2?"+(obj1.equals(obj2)));obj1引用指向的内容在new后并没有进行赋值,所以为假,即堆中的内容为未知。为false
System.out.println("s1=s2?"+(s1==s2));指向的栈地址不同啊,为false
obj1=obj2;是引用赋值,即指针赋值
System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1.equals(obj2)));
System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1==obj2));
上面二个全是TRUE,因为引用赋值后,指向的同一个对象,引用指针内容为同。所以为TRUE。
JAVA是面向对象的东西,之所以还使用栈的东西是为了速度上的考虑,堆中虽然使用灵活,但效率的确是个大问题,编译器还得动态进行内存大小的配置,而栈中虽然不能动态配置大小,但却使用的速度非常快。各有得失。
最后多谢ghyghost这么详细的答案
- 绿色标记出来的地方为什么最后为false,而下面的那个s3=s4的,确为true?
解答:绿色标记出来的s1和s3是不同的。s1是实例后的字符串是new的关系。开辟了新的内存空间。而s3不是。所以不是直接的==。所以equale的s1.s3是相等的。而后面的s3.s4因为字符串池的关系。其实是指的同一字符串。