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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangyinhui 中级黑马   /  2013-4-5 19:40  /  1020 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangyinhui 于 2013-4-5 20:37 编辑
  1. public static void main(String[] args) {
  2.                 String s1 = new String("abc");               
  3.                 String s2 = new String("abc");        
  4.                 String s3 = "abc";               
  5.                 System.out.println(s1.equals(s2));        
  6.                 System.out.println(s1 == s2);               
  7.                 System.out.println(s3.equals(s2));
  8.                 System.out.println(s1.equals(s3));
  9.                 System.out.println(s1==s3);
  10.                 System.out.println(s2==s3);
  11.         }
复制代码
结果是:
true
false
true
true
false
false
求解释原因?

8 个回复

倒序浏览
equal是比较内容的,==是比较地址的new出来的地址不同,但内容相同
回复 使用道具 举报
对应的:
1 、字符串是常量 这两个相当于是同一个对象  和内存管理有关 true
2 、"=="比较的是地址值 s1和s2是两个对象(分别用了两个new 创建的)肯定不会有相同的地址 false
3、同1
4、同1
5、6同2  
我觉得应该是这样
回复 使用道具 举报
你可以在论坛里面搜索下equals 与==,有很多这样的帖子将两者的区别讲得很详细的、、
回复 使用道具 举报
String类中自已有一个equals()方法,它覆盖了Object中的equals()方法.而String中的equals方法就是比较两个对象中的内容的.至于那些false就不用多解释了吧
回复 使用道具 举报
public static void main(String[] args) {
                String s1 = new String("abc");               
                String s2 = new String("abc");        
                String s3 = "abc";               
                System.out.println(s1.equals(s2));        
                System.out.println(s1 == s2);               
                System.out.println(s3.equals(s2));
                System.out.println(s1.equals(s3));
                System.out.println(s1==s3);
                System.out.println(s2==s3);
        }

因为==比较的是变量的值是否相同,而equals比较的是变量所指向的内容是否相同
例如:s1.equals(s2) 就是比较内容是否相同 ,因为s1、s2所指向内容是abc 所以返回值是true
在s1 == s2中因为 s1、s2的值是不同的地址值所以结果是false
回复 使用道具 举报
楼上的哥们说的很对,其实你这个问题就是涉及到   equals 与==的区别,我给你总结了一下,你可以参考一下,希望对你有所帮助吧!
  
  A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。
       B.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的。
       C.基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true)。
       D.一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同。
==和equals的实质。
       在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。
       基本数据类型在"栈"中存的是其内容值,而对象类型在"栈"中存的是地址,这些地址指向"堆"中的对象。
       java.lang包中的Object类有public boolean equals(Object obj)方法,它比较两个对象是否相等。
       其它对象的equals方法仅当被比较的两个引用指向的对象内容相同时,对象的equals()方法返回true。
       总之,"=="和"!="比较的是地址.也可认为"=="和"!="比较的是对象句柄;而equals()比较的是对象内容.或者说,,"=="和"!="比较的是"栈"中的内容,而equals()比较的是"堆"中的内容.
==操作符。专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相当,只能用==操作符。
      Java的基本数据类型为(char,byte,short,int,long,float,double,boolean)。
      如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(对内存),变量本身也占用一块内存,例如Object obj = new Object()变量obj是一个内存,new Object()是一个内存,此时,变量所对应的内存中存储的数据就是对象占用的那块内存的首地址。对于指向对象内存的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
回复 使用道具 举报
谢谢。。。
回复 使用道具 举报
s1,s2,s3是三个地址不同的引用,s1指向一个字符串类型的对象(初始化值为"abc"),s2指向另一个字符串类型的对象(初始化值为"abc"),s3指向常量池的"abc"。这3个"abc"内容相同,但是所存放的地址不同。
下来要明确:
==:是比较被指向的地址是否相同。
equals:是比较对象的内容是否相同。(s1.equals()就能看出,这个equals方法被对象s1调用)

第1个结果:比较两个对象的内容。
第2个结果:比较两个"abc"的地址。
第3个结果:比较两个对象的内容。
第4个结果:比较两个对象的内容。
第5个结果:比较两个"abc"的地址。
第6个结果:比较两个"abc"的地址。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马