equals和==的区别
equals和==的区别==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量...
equals和==的区别
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
(
“在堆中存储的地址是否相同”和“堆中的内容是否相同”有什么区别???总感觉是一个样的阿。。
) 展开
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
(
“在堆中存储的地址是否相同”和“堆中的内容是否相同”有什么区别???总感觉是一个样的阿。。
) 展开
36个回答
2014-01-16
展开全部
=号,在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比较的是两个字符串的内容
注意: =号左边必须是变量!
也就是说,把右边的内容拷贝给左边这个变量了,比如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类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
Eg:s1 = new String("sony"); //创建的是字符串对象
s1.equals("sony"); //返回
trues1 == "sony" //返回false
//如果
s1 = "sony";
s1 == "sony" //返回true
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
Eg:s1 = new String("sony"); //创建的是字符串对象
s1.equals("sony"); //返回
trues1 == "sony" //返回false
//如果
s1 = "sony";
s1 == "sony" //返回true
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-01-16
展开全部
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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
equals 只是比较值是否相同
而==则是比较两个变量 是不是同一个变量,也应时是说
要看看这两个变量是不是引用的同一个地址,
java 中只有引用地址相同的两个变量才被视为==
如果明白值传递与地址传递的话,这个问题应该不难理解
null放在前面就是为了避免变量为空时 引了空指针异常
如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了
而==则是比较两个变量 是不是同一个变量,也应时是说
要看看这两个变量是不是引用的同一个地址,
java 中只有引用地址相同的两个变量才被视为==
如果明白值传递与地址传递的话,这个问题应该不难理解
null放在前面就是为了避免变量为空时 引了空指针异常
如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以把==想象成人的长相是否一样
把equals想象成人的本质是否一样
==比较两个地址是不是一样的
equals比较两个地址指向的 实际对象的内容 是不是同一个
把equals想象成人的本质是否一样
==比较两个地址是不是一样的
equals比较两个地址指向的 实际对象的内容 是不是同一个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询