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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 燃烧端午   /  2012-6-20 23:44  /  4292 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String st="abc";  //创建一个对象st 然后将内存中 “abc”这个对象赋给 st;
String sr=“abc”;//创建一个对象st 然后将内存中 “abc”这个对象赋给 st;
用==号比较的是两个对象在内存中存放的地址
那么这样一来 “abc”这个对象又分别赋给了st和sr 所以 st和sr同时指向了“abc”这个内存地址,所以第一个比较结果为true
用equals()比较的是连个对象的值
这样的话st和sr的值都是“abc”那么这次比较的结果自然是true
同理如果用 new String(“”)的话结果就会成这样
String st=new String(“abc”);大家都知道new关键字是用来创建对象的,那么String st=new String(“abc”);这个就相当与在创建一个st对象值是“abc” 要知道这里是创建的st对象 不是上边的“abc”,然后下边有写了String sr=new String(“abc”);这样就又在内存中开辟了一个新的对象sr值也是“abc”。
这样的话我们用==号比较st和sr时,他们不是一个对象所以地址也不相同,所以这个结果是false
下边那么equals()方法的比较就不用我多说了吧。
回复 使用道具 举报
建议你看一个,JDK源代码。你可以看下它的实现机制,或者用GC查看。这个问题,其实字面上大家常说的。一个地址,一个值。这样只是我们更容易理解。其实,不是这样的。
回复 使用道具 举报
01.public class Judge {

02.

03.        /**

04.         * @param args

05.         */

06.        public static void main(String[] args) {

07.                // TODO Auto-generated method stub

08.                String st="abc";

09.                String sr="abc";

10.                System.out.println(st == sr);//true

11.                System.out.println(st.equals(sr));//true

12.                String st1 = new String("abc");

13.                String sr1 = new String("abc");

14.                System.out.println(st1 == sr1);//==当比较对象时比较的是两个对象的地址,而不是比较两个对象的值,所以Str1==Sr1进行比较时,值为False

15.                System.out.println(st1.equals(sr1));//equals当比较对象时比较的是两个对象的值,它们当被New时指向的是同一个堆中的值“abc”,所以st1==sr1,值为true

16.

17.        }

18.

19.}

回复 使用道具 举报
本帖最后由 feigecal 于 2012-6-24 09:09 编辑

程序在运行的时候会创建一个字符串缓冲池,当使用 String sr="abc";这样的表达时创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在上面,String st="abc";中st先被放到了池中,所以在sr被创建的时候,程序找到了具有相同值的 st,将 sr 引用 st 所引用的对象"abc"。下面,使用了 new 操作符,他明白的告诉程序:"我要重新创建一个对象"。于是一个新的"abc"Sting对象被创建在内存中。他们的值相同,但是位置不同,只是浪费了资源。==比较的是2个对象的地址,而equals比较的是2个对象的内容,不管是上面还是下面,对象 的内容都是abc所以你的equals()运算都是true。


我也是刚搞清楚,希望帮到你,共同进步,呵呵
回复 使用道具 举报
用new关键字后,实例化了对象,那么str1和str2就是两个引用,这两个引用指向的是两块内存,所以用“==”比较就不相同了。
回复 使用道具 举报
String st1 = new String("abc");  //这个在堆内存中新建了一个空间,值为“abc”,地址保存在st1中
String sr1 = new String("abc");   //这个在堆内存中又新建了一个空间,值为“abc”,地址保存在sr1中
System.out.println(st1 == sr1);//为什么会是返回false  ::st1 和 sr1存放的地址不同,肯定不相等了
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马