黑马程序员技术交流社区

标题: 关于String类的小问题 [打印本页]

作者: 927233671    时间: 2014-5-26 08:39
标题: 关于String类的小问题
本帖最后由 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. }
复制代码

作者: EDDY_Liang    时间: 2014-5-26 09:39
。 。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
作者: 路漫漫_求索    时间: 2014-5-26 09:57
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;

        }
}

作者: 927233671    时间: 2014-5-26 10:00
路漫漫_求索 发表于 2014-5-26 09:57
class StringDemo
{
        public static void main(String[] args)

呵呵,不应该是各自创建一个地址吧,而是各自对应一个地址值吧
作者: 路漫漫_求索    时间: 2014-5-26 10:02
927233671 发表于 2014-5-26 10:00
呵呵,不应该是各自创建一个地址吧,而是各自对应一个地址值吧

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

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

string.png

作者: yinxjfly    时间: 2014-5-26 12:42
String类复写了Object的toString()方法,(object中equals()方法内部封装的其实就是“==”来比较的)

作者: 成小龙    时间: 2014-5-26 13:21
== 就是比的引用地址,String类复写了Object类中的toString()方法,比的是内容是否相同
作者: 不一样的颜色    时间: 2014-5-26 13:40
成小龙 发表于 2014-5-26 13:21
== 就是比的引用地址,String类复写了Object类中的toString()方法,比的是内容是否相同 ...

String 类里面覆盖了equals()方法,比较的是两个字符串的值。而不是地址,所以返回的是true
作者: never615    时间: 2014-5-26 13:51
一楼你的理解对的,还有不要被二楼误导。。。。囧
作者: 成小龙    时间: 2014-5-26 13:53
不一样的颜色 发表于 2014-5-26 13:40
String 类里面覆盖了equals()方法,比较的是两个字符串的值。而不是地址,所以返回的是true ...

String类复写了Object类中的toString()方法   这话粘的上面的  懒得打  没注意
想省点时间真难
作者: 黄河一抔泥    时间: 2014-5-26 17:17
你的理解是对的s1="abc"  创建出的对象是被虚拟机放在串池中    new   出来的是单独的一个对象
作者: 不一样的颜色    时间: 2014-5-27 23:12
成小龙 发表于 2014-5-26 13:53
String类复写了Object类中的toString()方法   这话粘的上面的  懒得打  没注意
想省点时间真难 ...

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

我觉得应该补充一下上次那个,数组创建的问题在这里更好,可以更好的区分:lol
作者: heima_yjh    时间: 2015-3-13 02:08
凡是new出来的对象,一定会在堆中分配内存。s2的创建过程是,先查找常量池中是否有abc,如果没有,则在常量池中创建abc,然后在堆中创建对象abc。显然,s1已经在常量池中创建了一个abc对象,所以s2直接在堆中创建了一个对象,即s2指向了堆中的对象,s1指向了常量池中的对象。
作者: jipeng    时间: 2015-4-11 22:01
还没学到呢   还没知道呢
作者: daividtu    时间: 2015-11-7 21:29
String s1="abc"//创建一个字符串对象在常量池
作者: daividtu    时间: 2015-11-7 21:38
String s1="abc"//创建一个字符串对象在常量池  如果在创建一个字符串 如 String s2 = "abc" 此时在内存中它首先回去字符串池中查找当前字符串在池中是否含有 如果有就不创建 直接赋值给s2  此时s1的地址和s2的地址一样 ==比较的是内存中的地址 true  使用new 会在堆中开辟一块空间 地址不一样  此时为false
作者: 图兰朵    时间: 2016-3-28 02:40
顶一下!!!!!!
作者: Mr.Wu    时间: 2016-5-7 11:33
本帖最后由 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。
详见下图:



作者: innovator    时间: 2016-5-18 16:23
嗯,很多干货,学到了。
作者: wz529377283    时间: 2016-7-10 23:46
总结的好
作者: 亮仔开发    时间: 2017-3-3 14:58
String类构造了两个对象,一个在堆内存中,一个在方法区的常量池中




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