黑马程序员技术交流社区

标题: 关于视频第十三天中String对象的问题 [打印本页]

作者: 黑马王双    时间: 2013-4-18 14:01
标题: 关于视频第十三天中String对象的问题
本帖最后由 黑马王双 于 2013-4-18 21:20 编辑

class StringDemo
{
        public static void main(String[] args)
        {
               
                String s1 = "abc";

                String s2 = new String("abc");

                //s1和s2有什么区别?
                //s1在内存中有一个对象。
                //s2在内存中有两个对象。
                //不明白问题一:怎么理解s2有两个对象,最好有个图解或者详细的说明。
               
                System.out.println(s1==s2);
                System.out.println(s1.equals(s2));//String类复写了Object类中equals方法,
                                                                                //该方法用于判断字符串是否相同。
                String s = "abcde";
                method_1(s);
        }
}

不明白问题二:关于此题自己对于‘==’和equals的理解是否正确?
在此题中‘==’比较的是引用数据地址是否相同,输出结果为false,说明不同,那么s2是两个对象,是有两个地址么?
因为String类复写了Object类中equals方法,字符串是一样的,均为“abc”,如果没有复写的话判断的结果应该和‘==’一样,对么?
还是本来其它的地方就没有理解到,请大家指教。

对于‘==’和equals一直有比较模糊的概念,首先查了一下这两个的区别。
Equals方法判断内容是否相同。
插入部分:
简单理解为:‘==’只负责基本数据类型比较,和引用对象地址比较,而equals则是比较两个对象间的内容是否一样。(当然这个说法比较片面)

“==”:
              a、对基本数据类型变量来说,它比较的是左右两边的值是否相等。
              b、对引用数据类型变量来说,它比较的是左右两边的引用地址是否相同。

“equals()”:
首先,该方法是定义在Object类中的,则java中每个类都可以调用该方法。
      a、对于Object类或没有覆盖equals()方法的类来说,它是判断调用equals()方法的引用与传递进来的引用是否一致,是否指向同一个对象,此时可以认为是等价于“==”的。
      b、对于String类中的equals()方法来说,它是对Object类中的equals()方法进行重写之后的,它判断的是当前字符串与传进来的字符串的内容是否一致。
      c、对于自定义类且覆盖equals()方法的类来说,它是对Object 类中的equals()方法进行重写之后的,它使用用户重写的代码来判断需要自定义比较的内容是否一致。

作者: 殇_心。    时间: 2013-4-18 14:40
问题一:我觉得画图就没必要了。
String s1 = "abc";//直接引用常量池中的"abc",记住不是在堆内存中,而是在常量池中。
String s2 = new String("abc");//先使用常量池中的"abc"直接量,此为一个对象;再调用String类的构造器来创建一个新的String对象,这是在堆内存中,此为另一个对象。

问题二:
你这样理解是对的。
哥们,你都找了那么多资料证明了,还问个啥啊。
搞不懂。
作者: 黑马王双    时间: 2013-4-18 15:51
殇_心。 发表于 2013-4-18 14:40
问题一:我觉得画图就没必要了。
String s1 = "abc";//直接引用常量池中的"abc",记住不是在堆内存中,而是 ...

谢谢,再问一句,s2的指向?
作者: 易杰    时间: 2013-4-18 16:19
字符串比较

                ==比较:==比较两个基本数据类型时,比较的是数据的值。比较引用数据类型或对象时,比较的是堆内存地址。

                equals()比较:Objecte类中的quals()方法比较的是数据的堆内存地址,String类中的quals()方法比较的是数据的值,因为String类覆盖了父类Objecte中的quals()。

       示例代码:

             String str1 = "abc";

             String str3 = "abc"

             String  str2 = new  String ("abc");


                    str1==str2 //false,==比较的是堆内存地址,new表示在堆内存中新申请一个内存地址。

                     str1.equals(str2); //true,String类中的quals()方法比较的是数据的值,两个字符串对象存储的都在"abc"。

                    str1==str3//true,String str3 = "abc",没用使用new新申请一个内存地址,str3指向的之前创建的"abc"的堆内存地址。

作者: 殇_心。    时间: 2013-4-18 16:19
黑马王双 发表于 2013-4-18 15:51
谢谢,再问一句,s2的指向?

堆内存地址。。。为啥回复需要10个字啊
作者: 黄玉昆    时间: 2013-4-18 20:30
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢




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