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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈妙俊 中级黑马   /  2014-4-14 20:43  /  1484 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈妙俊 于 2014-4-14 22:19 编辑

equals()和==到底什么区别?
不是说equals比较的是内存地址么
class Test{
      public static void main(String[] args){
                 String s1="Monday";                  String s2="Monday";
                  String s3=new String("Monday");
               System.out.println(s1==s2);            ===ture
               System.out.println(s1==s3);            ===false
               System.out.println(s1.equals(s2));  ===ture
               System.out.println(s1.equals(s3));  ===ture
     }
}

点评

这个问题已经有很多人提问过了,请仔细阅读版规,否则我们将扣分处理  发表于 2014-4-14 21:31

9 个回复

倒序浏览
==
在用于数值类型对比时是比较数值是否相等,用于其他类型比如字符时候是对比内存地址。
equals
我记得是用来对比类型内容例如字符串内容是否相等的。
我记得是这么理解。不知道对不对,我也是菜鸟啊。
回复 使用道具 举报
论坛关于这俩的区别估计有不下几十个帖子,楼主请右上角  点击“帖子搜索”。 嘿嘿~ 请叫我红领巾!
回复 使用道具 举报
其实就是比较只有两种:基本数据类型和引用对象。
前者用哪个结果都一样——相等为true 否则为false。
如果是引用对象就有区别了,就要比较栈内存地址是否相等。
你创建两个String对象的时候,内存地址不同,但你给它们赋了相同的值。
这时==比较内存地址,而equals比较值。
所以你得到上面那些输出结果。
回复 使用道具 举报
equals是字符串特有的比较方法,通常被用来比较两个变量的引用地址,==是比较两边的数值,
回复 使用道具 举报
lz,你的问题其实有两个。
1. 首先确定一下:equals比较的是内容, == 比较的是内存地址,这是肯定的
2. 你的代码中,s1和s2其实是一个对象,内存地址也相同,所以不论是用 equals和“==”,结果都是true
这是string的缓冲池的问题,创建字符串的时候,如果不是用new的方法而是这种String s1="Monday"
等出字符串的方法,jvm会在字符串缓冲池(个人理解为内存中一个区域)中寻找这个字符串有没有已经建立好的实例,
如,建立s2的时候,在缓冲池中找到了s1,所以他俩地址一样。
而s3就不一样了,它是new出的对象,重新占据了新的内存地址,故,s3和s1,equals比较内容为true
“==”比较地址为false

  1. package com.itheima.mark;

  2. public class test2 {
  3.        
  4.         public static void main(String[] args) {
  5.                 /**
  6.                  * lz,你的问题其实有两个。
  7.                  * 1. 首先确定一下:equals比较的是内容, == 比较的是内存地址,这是肯定的
  8.                  * 2. 你的代码中,s1和s2其实是一个对象,内存地址也相同,所以不论是用 equals和“==”,结果都是true
  9.                  *              这是string的缓冲池的问题,创建字符串的时候,如果不是用new的方法而是这种String s1="Monday"
  10.                  *              等出字符串的方法,jvm会在字符串缓冲池(个人理解为内存中一个区域)中寻找这个字符串有没有已经建立好的实例,
  11.                  *              如,建立s2的时候,在缓冲池中找到了s1,所以他俩地址一样。
  12.                  *              而s3就不一样了,它是new出的对象,重新占据了新的内存地址,故,s3和s1,equals比较内容为true
  13.                  *           “==”比较地址为false
  14.                  */
  15.                 String s1="Monday";                  
  16.                 String s2="Monday";
  17.         String s3=new String("Monday");
  18.         System.out.println(s1==s2);            //ture
  19.         System.out.println(s1==s3);            //false
  20.         System.out.println(s1.equals(s2));     //ture
  21.         System.out.println(s1.equals(s3));     //ture
  22.         }
  23. }
复制代码
回复 使用道具 举报
東少 中级黑马 2014-4-14 21:48:52
7#
"=="运算符判断两个对象的引用内存地址是否相同. equals方法比较对象是否在逻辑上相等. equals默认比较的是对象的引用地址 等同于"==".一般情况下,自定义的对象需要复写equals方法来保证逻辑相等
String类equals将此字符串与指定的对象比较,复写了equals方法建立字符串自己的判断相同的依据,通过字符串对象中的内容来判断的
回复 使用道具 举报
class Test{
      public static void main(String[] args){
                 String s1="Monday";                  String s2="Monday";
                  String s3=new String("Monday");
               System.out.println(s1==s2);            ===ture/比较的是内存中的地址值,因为s1和s2的具体对象是一样的  所以在内存中只会开辟一个空间  所以这个的结果是true
               System.out.println(s1==s3);            ===false//s1和s3是不一样的  s1是一个对象 而s2是有两个对象 所以在内存中不是同一块空间 所以他们的内存地址值是不一样的  所以结果为false
               System.out.println(s1.equals(s2));  ===ture//在字符串中重写了equals方法  比较的是具体的对象值 不在是地址值  因为s1和s2的具体对象值是相同的 所以结果为true
               System.out.println(s1.equals(s3));  ===ture//s1和s3的具体对象值也相同 所以结果也为true
     }


原因已写在代码中  
}
回复 使用道具 举报
波涛 中级黑马 2014-4-14 22:07:16
9#
"==" 是判断符号两边的对象是否相等,即它们的内存地址是否相等;
equals() 是判断两个对象的值是否相等,而不管它们的内存地址是否相等.(当然,若它们的内存地址相等,值一定相等);以下是典型示例:
  1. public class Test2 {
  2. public static void main(String[] args) {
  3. String str1 = "apple"; ⁄*先查看字符串池里有没有这个值,若没有,则开辟一个空间用来存放这个值*/
  4. String str2 = "apple"; ⁄*先查看字符串池里有没有这个值,若有,则str2指向这个内存地址*/
  5. System.out.println("str1==str2:"+(str1==str2));  ⁄*因为str1与str2的内存地址一样,所以"=="的结果为true*/
  6. System.out.println("str1 equals str2:"+str1.equals(str2));

  7. String str3 = new String("banana");
  8. String str4 = new String("banana"); ⁄*分别创建了两个不同的字符串对象,str3和str4*/
  9. System.out.println("str3为"+str3+"\nstr4为"+str4);
  10. System.out.println("str3==str4:"+(str3==str4));
  11. System.out.println("str3 equals str4:"+(str3.equals(str4)));
  12. ⁄*str3和str4分别代表两个不同的内存地址,所以"=="的结果为false*/
  13. ⁄*这时应该看得出String类型的两种创建对象的方法之间的区别了吧!要注意的是第一种创建对象方法采用的池技术对象的值可以重复利用*/

  14. int i1 = 10;
  15. int i2 = 10;
  16. System.out.println("i1==i2:"+(i1==i2));
  17. ⁄*为什么结果为true?本人的理解是:int只是一个基本数据类型,不是一个封装类型.而它的封装类型Integer则符合上面的原理请看下面代码*/

  18. Integer integer1 = new Integer(10);
  19. Integer integer2 = new Integer(10);
  20. System.out.println("integer1==integer2:"+(integer1==integer2));
  21. System.out.println("integet1 equals integer2:"+integer1.equals(integer2));

  22. Object obj1 = new Object();
  23. Object obj2 = obj1;
  24. System.out.println("obj1==obj2:"+(obj1==obj2));
  25. //对象obj1和obj2都指向同一个内存地址.
  26. }
  27. }
复制代码
运行效果图:


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马