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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 927233671 中级黑马   /  2014-5-26 08:39  /  6247 人查看  /  26 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 927233671 于 2014-5-26 20:03 编辑
  1. class StringDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s1="abc";
  6.                 String s2=new String("abc");
  7.                 System.out.println(s1==s2);//这个比较的是s1和s2的内存地址值,s2是new的一个新对象,所以不一样,不知道我的理解对吗
  8.                 System.out.println(s1.equals(s2));//这比较的是对象中的内容,都是"abc",所以一样。
  9.         }
  10. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

26 个回复

正序浏览
String类构造了两个对象,一个在堆内存中,一个在方法区的常量池中
回复 使用道具 举报
总结的好
回复 使用道具 举报
嗯,很多干货,学到了。
回复 使用道具 举报
本帖最后由 Mr.Wu 于 2016-5-7 11:35 编辑

理解的基本正确
1. s1==s2, 比较的是s1和s2存放的地址是否相同 ;
2. s1.equals(s2),比较的是 s1和s2指向的内容是否相同;
3.String s1="abc", “abc”存放在常量池中;
4. String s2=new String("abc");  new的东西存放在堆中。
5. 推荐用步骤3。
详见下图:


回复 使用道具 举报 1 0
顶一下!!!!!!
回复 使用道具 举报
String s1="abc"//创建一个字符串对象在常量池  如果在创建一个字符串 如 String s2 = "abc" 此时在内存中它首先回去字符串池中查找当前字符串在池中是否含有 如果有就不创建 直接赋值给s2  此时s1的地址和s2的地址一样 ==比较的是内存中的地址 true  使用new 会在堆中开辟一块空间 地址不一样  此时为false
回复 使用道具 举报 1 0
String s1="abc"//创建一个字符串对象在常量池
回复 使用道具 举报
还没学到呢   还没知道呢
回复 使用道具 举报
凡是new出来的对象,一定会在堆中分配内存。s2的创建过程是,先查找常量池中是否有abc,如果没有,则在常量池中创建abc,然后在堆中创建对象abc。显然,s1已经在常量池中创建了一个abc对象,所以s2直接在堆中创建了一个对象,即s2指向了堆中的对象,s1指向了常量池中的对象。
回复 使用道具 举报
夏日蓝雪 发表于 2014-5-26 11:53
理解的很对,我也是这么理解的,我上传了一个自己画的一张图片来说明:
s1==s2 表示s1和s2的内存地址值相同 ...

我觉得应该补充一下上次那个,数组创建的问题在这里更好,可以更好的区分:lol
回复 使用道具 举报
百度一下,常量池那里也没搞清楚
回复 使用道具 举报
在字符串中“abc”本身就是一个对象了 String a="abc";即指向了一个对象,值为abc,但是
String b=new String("abc");new了一个对象还有“abc”本身一个对象,指向了两个对象,equals()方法被复写了的,比较的是对象中的值
回复 使用道具 举报
若对象是非引用的,==号比较的是两者的值,若对象是引用的,==号比较的是内存地址值;equals比较的是两者的数值
回复 使用道具 举报
成小龙 发表于 2014-5-26 13:53
String类复写了Object类中的toString()方法   这话粘的上面的  懒得打  没注意
想省点时间真难 ...

public boolean equals(Object anObject)将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。(这是java API文档中的介绍)
回复 使用道具 举报
你的理解是对的s1="abc"  创建出的对象是被虚拟机放在串池中    new   出来的是单独的一个对象
回复 使用道具 举报
不一样的颜色 发表于 2014-5-26 13:40
String 类里面覆盖了equals()方法,比较的是两个字符串的值。而不是地址,所以返回的是true ...

String类复写了Object类中的toString()方法   这话粘的上面的  懒得打  没注意
想省点时间真难
回复 使用道具 举报
一楼你的理解对的,还有不要被二楼误导。。。。囧
回复 使用道具 举报
成小龙 发表于 2014-5-26 13:21
== 就是比的引用地址,String类复写了Object类中的toString()方法,比的是内容是否相同 ...

String 类里面覆盖了equals()方法,比较的是两个字符串的值。而不是地址,所以返回的是true
回复 使用道具 举报
== 就是比的引用地址,String类复写了Object类中的toString()方法,比的是内容是否相同
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马