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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 yting_xmei1129 于 2013-9-21 20:06 编辑

                String s1 = "abc";
                String s2 = "abc";
                String s3 = new String("abc");
                String s4 = new String("abc");
               
                //先看==的区别
                System.out.println(s1 == s2);
                System.out.println(s2 == s3);
                System.out.println(s3 == s4);
               
                //在看equals方法的区别
                System.out.println(s1.equals(s2));
                System.out.println(s2.equals(s3));
                System.out.println(s3.equals(s4));
        
                /*下面才是重点(别人帖子的回复)

                String str=new String("abc")同String str="abc"的区别:
                   1. 两个字符串在内存中分配的位置不同
                   2. String str=new String("abc")是在堆内存中存放的
                   3. String str="abc"是在栈内存中存放的
                   4. 由于两个对象存放的位置不同,所以所引用的地址就不一样,所以如果两个值用equals("")方法比较时,会得出false的结论。
                评分

                参与人数 1        技术分 +1        收起理由
                查看全部评分
               
                 */
                重点中的重点,给技术分了、、、
                但是我的equals("")方法的结果是 true,这、、、、、、应该不是饿理解错误吧,那个帖子还给技术分了,应该给饿两分的啊!
                饿都找出给分错误来了、、、嘿嘿、、、

5 个回复

倒序浏览
忘记给出运行结果了,下面是运行结果--->


true
false
false
true
true
true
回复 使用道具 举报
1,在这里"=="只会去比较应用变量的内存地址计算出来的hash码值,由于String s3=new String("abc")这段代码总共有三个对象,一个是"abc"真实值存在栈中,二是new String()对象该对象是在堆内存中属于无名的对象,最后是s3对象也是在堆内存中,所以用"=="来比较的话当然是false了
2,equals()方法的比较实现原理是首先将两个对象的内存地址进行比较,如果相同的话说明是同一个对象就会立即返回true,如果地址不同的话再将两个对象的真实值进行比较(也就是引用栈中的变量值)如果相等的话也会返回true否则返回false,所以s3.equals(s4));和s2.equals(s3);是会返回true的.

3,"=="如果比较的是基本数据类型的话只比较基本数据类型的值,而不再比内存地址.在这里是比String引用类型所以不必栈中的值只比内存地址看是否是同一个对象.

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1

查看全部评分

回复 使用道具 举报
首先,当你String s1 = "abc";String s2 = "abc";时,并不新开辟一个空间储存,而是都指向同一个"abc",当你用new的时候,就会开辟新的空间。也就是说,s3和s4都各自指向另外的存储空间。
第二,==比较的是两者的内存值,那么根据上面说的,只有s1和s2是指向同一个内存的。s2和s3,s4的==判断结果都是false。
第三,在String中,jdk已经为我们重写了equals()方法,JDK API1.6中这样写的:
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
其实就是非空情况向下,只比较字符串内容,而不管其内存地址如何,所以后面的三个都是true。

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1

查看全部评分

回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。 以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
这个其实还是问的==和equals是的区别
==:
*                 如果是基本类型,比较的是基本类型的值是否相同
*                 如果是引用类型,比较的是引用类型的地址值是否相同
equals:只能比较引用类型
*                 默认比较的是地址值是否相同。如果类重写了equals方法。那么就按照重写后的进行比较。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马