java 中=与equals与==的区别
public class Example1
{
public static void main(String[] args)
{
String s1=new String("abc");
String s2=new String("abc");
s1=s2;
System.out.println(s1==s2); //true
}
}
这里为什么加上s1=s2结果就是true那,我知道string中的equals比较的是字符串,==比较的是引用地址,那这里的那个等号表示的是什么那。s1=s2它比较的是什么那。
答案:=号,在Java里面不是比较,=号叫做赋值符号,
注意: =号左边必须是变量!
也就是说,把右边的内容拷贝给左边这个变量了,比如int i = 1; 那么int类型变量i的值就是1 了
下面帮你详尽分析一下这个程序:
public class Example1
{
public static void main(String[] args)
{
String s1=new String("abc");
String s2=new String("abc");
s1=s2;
System.out.println(s1==s2); //true
}
}
内存中真实的情况是这样的,现在,main方法开始执行,
首先第一句话, String s1=new String("abc"); 执行这句话的时候,是new一个String对象,势必调用String类的构造方法,把参数 "abc" 传进去,"abc"是一个字符串常量,字符串常量是String类的一个对象,字符串常量分配在内存的data segment(数据区),现在数据区就有了一个"abc"对象,然后紧接着new String("abc"),又new了一个String对象,new出来的对象分配在内存的heap(堆区),现在堆内存就有了一个new出来的String对象,
方法内部声明的变量属于局部变量,s1是在main方法内部声明的,显然属于局部变量,局部变量分配在内存的Stack(栈区),现在栈区分配了一个String类型的变量s1,因为String是类,不是基本数据类型,String类是引用数据类型,所以s1在Java里面的标准叫法是引用,s1的值就是一个地址,通过这个地址,就可以找到这个new出来的这个String对象,所以,用一句话来描述:引用s1指向了堆内存中new出来的这个String对象,
执行完第一句话以后,内存中有2个String对象
现在执行第2句话,
String s2=new String("abc");
Java虚拟机对于data segment的内容会有一个优化,就是如果已经存在,就不再分配第二个了,因为执行第一句的时候,data segment 已经有一个"abc"了,那么现在就不会分配第二个同样的了,
现在,直接new了一个String对象, 引用s2指向了他,
所以第2句话只分配了一个对象,执行完第2句话,现在内存中一共有3个String对象了,2个位于heap,1个"abc"位于data segment
然后第3句话,s1=s2;
=号,在Java里面不是比较,=号叫做赋值符号,是赋值的意思,注意: =号左边必须是变量!也就是说把右边的内容拷贝给左边这个变量,在我们这里,在执行这句话之前,引用s1和s2分别各自指向了堆中的一个String对象,s1和s2的值分别是这两个String对象的地址,因为是两个对象,所以两个地址肯定是不一样的,但是现在,s1=s2 ,就把s2的值拷贝给s1了,就把s2记录的地址拷贝给是s1了,换句话说,s1和s2的值一样了,s1和s2具有相同的地址了,s1和s2此时指向同一个对象了,s1也指向先s2所指向的这个对象了,s1和s2现在都指向这个对象,他们的引用地址相同了!
最后一句,System.out.println(s1==s2);
打印出 s1==s2 的结果,==比较的是引用地址,现在s1和s2指向同一对象,引用地址当然相同,所以打印结果为 true
然后main方法就执行结束了,注意:方法结束以后,为这个方法分配的所有局部变量,全部清空,全部消失,所以这些String对象已经没有引用指向他们了,这就是传说中的垃圾,他们等待垃圾回收器回收
总结:
= 是赋值
== 比较引用地址
再说equals方法,有些人上来就说equals方法比较的内容,其实这是不全面的,equals方法和==的区别,面试也经常考,
equals方法是父类Object所定义的方法,用来实现两个对象内容是否相等的逻辑,说equals方法要从两个方面:
1)从Object角度来说,==与equals是一样的,都是比较引用,因为Object类的equals()方法这样定义的, public boolean equals(Object obj) { return (this == obj); }
方法内部的实现就是比较引用地址,用的也是==号,所以对于Object来讲,equals与==是一样的
2)对于其它类来说,可以根据需要,在自定义的类中重写(Override) equals方法,实现内容是否相等的逻辑,因为String类重写了equals方法,所以我们才说String的equals比较的是两个字符串的内容
equals是比较两个对象的值是否相等,而==比较这两个是否是同一对象;比如
String s1=new String("abc");
String s2=new String("abc");
此时s1.equals(s2),因为他们的值相同所以true;
而s1==s2,他们两个不是同一个对象,所以为false;
而=则是赋值的意思如果s1=s2,是将s2付给s1,这时他们指的都是s2这个对象,所以此时s1==s2为true
这个是比较地址。。。你申明了两个对象,s1和s2然后把s2的地址赋予s1 然后比较他们的地址 ,当然是true
s1=s2是把s2付给s1
java 中=与equals与==的区别
"="//表示赋值的意思 即 int i=0;//代表把右边的0赋值到左边的变量i里面!
"=="//比较对象是否相等,比较普通类型如int double的值是否相等
"equals"//比较两个对象的值是否相等!
就是把s2的只赋给s1,
=是用来赋值的。
比较的是内存地址
因为 s1=s2;所以s2也指向s1所指向的字串地址
==是表示两个要比较的对象是否指向同一个内存地址(比较地址)
equals是表示两个要比较的对象的值是否相等(比较值)。
答案补充s1=s2是把他们两指向同一段内存地址
给个网址你,你自己去看一下吧: http://d-ragon.javaeye.com/blog/88489那里面的说的更精彩!equals比较的是两个东西的内容
如果相同则为true
==比较的是两个东西的内存地址,如果不是一个对象,那么自然就是 false
==是比较对象 也就是比较引用地址是不是相等
equals是比较值
"="是用来给变量赋值的 如:int a = 0;就是把0给a了
“==”是用来比较两边的数据是否相同的,如:A a = new A();A是你定义的类方法,if(a==null)
“equals”是比较两个变量是否相同,如:String a = “s”;就可以if(a.equals("s"))
s1=s2号的意思是将右边的值赋给左边,如果s1=s2左右都是同一个类的不同对象时,就是把它们指向同一个对象s2中,所以s1其实就是s2!当比较s1和s2的时候就像自己比较自己一样,当然是true了。
equlas方法是比较两个对象里面的值是否相等,而==是比较是否是同一个对象!
=号是赋值的
上一个:java 中 log4j 的概念、作用以及如何使用
下一个:java编程有哪几本书比较适合初学者?