黑马程序员技术交流社区

标题: ==比较String问题求解 [打印本页]

作者: 沈样    时间: 2012-3-2 15:26
标题: ==比较String问题求解
                String a = "ab";
                String bb = "b";
                String b = "a" + bb;
                System.out.println((a == b));//返回是false
作者: 马胜平    时间: 2012-3-2 15:33
你应该不会不知道equals和==的区别吧 a和b引用的地址不同
作者: 张开开    时间: 2012-3-2 15:42
== 和 equals 的用法你要清楚。==是比较的对象在内存中的地址,而equals是比较对象的内容是否相同,你所写的a和b指向的不是同一个对象,即便其值相同,对象地址也不同。
作者: 沈样    时间: 2012-3-2 15:48
找了半天或许以上解释可以解释这个问题:
字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。
作者: 沈样    时间: 2012-3-2 15:50
这就可以解释
                String a = "ab";
                String bb = "b";
                String b = "a" + bb;
                System.out.println((a == b));//返回是false
                 String x = "ab";
                String y = "a" +"b";
                System.out.println((a == b));//返回是true
一个小问题拿出来跟大家分享一下
作者: 李成航    时间: 2012-3-2 16:28
“==”等号比较的是引用地址,你的两个string是不同的对象地址,当然返回false。
equals比较的是对象的内容是否相同,显然你那两个内容是相同的,若用equals判断将会返回true。
作者: 陈建凡    时间: 2012-3-2 16:58
本帖最后由 陈建凡 于 2012-3-2 17:04 编辑

                 String a = "ab";
                String bb = "b";
                String b = "a" + bb;
                System.out.println((a == b));//返回是false


String a="ab" 和String a=new String();是一样的效果,都是new 产生了 新的对象,新的对象分配的内存肯定不一样,在String中
使用“+”拼接字符串时会生成新的String对象,“==”比较是两个是不是同一对象,所以会是 false,如果 是比较相等的话。使用equals。来比较它们的大小。

但是有一个比较有趣的问题
代码
       String str3="chenjianfan";
            String str4="chenjianfan";
            System.out.println(str3==str4);
            System.out.println(str3.equals(str4));、

这两个输出的结果都是 true; 有点矛盾咯。这个是有关于是”字符串池“的问题,这个我看别的视频看到的,跟大家分享下。

    String str3="chenjianfan";(采用字面值方式赋值)

   1)首先会在 String Pool(“字符串池”)查找有没有“chenjianfan”这个字符串对象,如果没有有,则在String Pool中再去创建一个“chenjianfan”字符串对象,然后将在String Pool中的这个“chenjianfan”字符串对象的地址返回,赋给引用变量str3,这样str3就会指向String Pool中的这个“chenjianfan”字符串对象

2)如果有的话,不会在String Pool中再创建这个字符串对象,直接把存在的这个“chenjianfan”字符串对象的地址赋给Str3.

所以String str3="chenjianfan"时,已经在String Pool中创建了“chenjianfan”字符串对象,当String str4="chenjianfan"时,在StringPool中找到了这个对象,直接把这个字符串对象的地址,赋给str4.!所以“==”和equals()都是true。


作者: 黄业凌    时间: 2012-3-2 17:32
1."=="用于标识标识相等的意思
2.比较基本数据类型的时候,通过比较它们实际的值来判断是否相同
3.比较引用类型的时候,比较两个引用的地址是否相等(也就是是否指向同一对象)
    String a = "ab";
                String bb = "b";
                String b = "a" + bb;
                System.out.println((a == b));//返回是false
a 在内存中开辟了一块空间 ab
b 在内存中开辟了一块空间 a,
两者对指向的内存地址不是同一对象.
作者: 陈斌    时间: 2012-3-2 18:34
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

    ==比较的是2个对象的地址,而equals比较的是2个对象的内容。

    显然,当equals为true时,==不一定为true;






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2