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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 927233671 中级黑马   /  2014-5-26 08:39  /  6323 人查看  /  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 个回复

倒序浏览
。 。equals这个单词还没学到:L
不过我想你上面的设定的是字符串类型的数组变量,
你下面的初始化就错了
String s1={"abc"};    //这里要加大括号
String s2=new String{"abc"}    //;这里要把括号改成大括号
System.out.println(s1==s2);  //这个理解是对的。。s1和s2多事字符串类型数组的初始化名字,而名称是在桟内存里的,然后把堆内存里新建的数组的地址值赋值给名称,所以s1、s2的值就不一样,所以不能用等同于(==),不过因为两个变量的内涵是一样的所以可以赋值,比如s1=s2,那s1的就指向了s2变量所指向的字符串类型的数组了。
希望可以帮到你。
pass:其实我也刚学不到8天、:lol
回复 使用道具 举报
class StringDemo
{
        public static void main(String[] args)
        {
                String s1="abc";
                String s2=new String("abc");
                System.out.println(s1==s2);               //这个比较的是s1和s2的内存地址值,它们两个分别在内存里面各自创建一个内存地址,所以它们相比的结果是False

                System.out.println(s1.equals(s2));
                //这两个比较的是两个对象的字符串是否相同,因为String类对象覆写了Object类中的equals方法。所以它们相比的结果是true;

        }
}
回复 使用道具 举报
路漫漫_求索 发表于 2014-5-26 09:57
class StringDemo
{
        public static void main(String[] args)

呵呵,不应该是各自创建一个地址吧,而是各自对应一个地址值吧
回复 使用道具 举报
927233671 发表于 2014-5-26 10:00
呵呵,不应该是各自创建一个地址吧,而是各自对应一个地址值吧

哈哈,一个意思
回复 使用道具 举报
建议你  百度一下  常量池吧 你的理解其实也算对  不过可以去仔细弄懂一下  到底是什么回事
回复 使用道具 举报
理解的很对,我也是这么理解的,我上传了一个自己画的一张图片来说明:
s1==s2 表示s1和s2的内存地址值相同 ;
s1.equals(s2)表示 s1和s2在堆内的内容相同。
new指重新开辟一块空间,也就意味着其地址不同,内容不一定。
明白了其中的含义,答案自然揭晓。

string.png (8 KB, 下载次数: 182)

string.png

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 很给力!

查看全部评分

回复 使用道具 举报
String类复写了Object的toString()方法,(object中equals()方法内部封装的其实就是“==”来比较的)
回复 使用道具 举报
== 就是比的引用地址,String类复写了Object类中的toString()方法,比的是内容是否相同
回复 使用道具 举报
成小龙 发表于 2014-5-26 13:21
== 就是比的引用地址,String类复写了Object类中的toString()方法,比的是内容是否相同 ...

String 类里面覆盖了equals()方法,比较的是两个字符串的值。而不是地址,所以返回的是true
回复 使用道具 举报
一楼你的理解对的,还有不要被二楼误导。。。。囧
回复 使用道具 举报
不一样的颜色 发表于 2014-5-26 13:40
String 类里面覆盖了equals()方法,比较的是两个字符串的值。而不是地址,所以返回的是true ...

String类复写了Object类中的toString()方法   这话粘的上面的  懒得打  没注意
想省点时间真难
回复 使用道具 举报
你的理解是对的s1="abc"  创建出的对象是被虚拟机放在串池中    new   出来的是单独的一个对象
回复 使用道具 举报
成小龙 发表于 2014-5-26 13:53
String类复写了Object类中的toString()方法   这话粘的上面的  懒得打  没注意
想省点时间真难 ...

public boolean equals(Object anObject)将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。(这是java API文档中的介绍)
回复 使用道具 举报
若对象是非引用的,==号比较的是两者的值,若对象是引用的,==号比较的是内存地址值;equals比较的是两者的数值
回复 使用道具 举报
在字符串中“abc”本身就是一个对象了 String a="abc";即指向了一个对象,值为abc,但是
String b=new String("abc");new了一个对象还有“abc”本身一个对象,指向了两个对象,equals()方法被复写了的,比较的是对象中的值
回复 使用道具 举报
百度一下,常量池那里也没搞清楚
回复 使用道具 举报
夏日蓝雪 发表于 2014-5-26 11:53
理解的很对,我也是这么理解的,我上传了一个自己画的一张图片来说明:
s1==s2 表示s1和s2的内存地址值相同 ...

我觉得应该补充一下上次那个,数组创建的问题在这里更好,可以更好的区分:lol
回复 使用道具 举报
凡是new出来的对象,一定会在堆中分配内存。s2的创建过程是,先查找常量池中是否有abc,如果没有,则在常量池中创建abc,然后在堆中创建对象abc。显然,s1已经在常量池中创建了一个abc对象,所以s2直接在堆中创建了一个对象,即s2指向了堆中的对象,s1指向了常量池中的对象。
回复 使用道具 举报
还没学到呢   还没知道呢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马