黑马程序员技术交流社区

标题: 学习String时遇到的问题 [打印本页]

作者: て淡莣了陌生    时间: 2013-4-28 08:47
标题: 学习String时遇到的问题
本帖最后由 て淡莣了陌生 于 2013-4-28 10:29 编辑

class Demo1{

        public static void main(String[] args) {
                String s1 = "abc";
                String s2 = "a" + "bc";               
                System.out.println(s1);
                System.out.println(s2);
                System.out.println(s1.equals(s2));
                System.out.println(s1 == s2);
        }
    }
class Demo2{

        public static void main(String[] args) {
                String s1 = "abc";
                String s2 = "a";
                String s3 = "bc";
                String s4 = s2 + s3;
               
                System.out.println(s1);
                System.out.println(s4);
                System.out.println(s1.equals(s4));
                System.out.println(s1 == s4);        
        }
}

以上两段代码运行后的结果为什么一个是true,一个是false呢,不理解,求解释!!!
作者: HM邱刚权    时间: 2013-4-28 09:03
这个问题论坛里面有很多! 其实是指向问题 第一个很简单看就是赋值不多说,
第2个
public static void main(String[] args) {
                String s1 = "abc";
                String s2 = "a";
                String s3 = "bc";
                String s4 = s2 + s3;
                System.out.println(s1);
                System.out.println(s4);
                System.out.println(s1.equals(s4));
                System.out.println(s1 == s4);        
   且看!S4他不是赋值应该正确的说是不会给他分配空间的 他是指向了S2和S3 所以他不能很准确的说是赋值
当程序走到System.out.println(s1 == s4); 时 他就指向了S2  和S3所以当然为false;
作者: 殇_心。    时间: 2013-4-28 09:05
System.out.println(s1.equals(s4));//结果为true。equals只是比较他们的值想不想等。
                             //s1的值是"abc",s4的值也是"abc".
  System.out.println(s1 == s4); //比较引用地址值。s1是调用常量池中的字符串"abc";
                            //而s4是不能在编译期就确定下来。不能引用常量池中的"abc"字符串。
                            //所以输出false
作者: harborbest    时间: 2013-4-28 09:07
==    是比较两个对象的地址是否相同 也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等
equals是用于比较两个独立对象的内容是否相同。
java一般都是值传递,所以你
String s2 = "a" + "bc";   
和这样      
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
本质是一样的!

作者: harborbest    时间: 2013-4-28 09:07
==    是比较两个对象的地址是否相同 也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等
equals是用于比较两个独立对象的内容是否相同。
java一般都是值传递,所以你
String s2 = "a" + "bc";   
和这样      
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
本质是一样的!

作者: 袁梦希    时间: 2013-4-28 09:08
这样的问题确实有很多,众说纷纭,我跟楼主同求{:soso_e120:}

我要手机这样的帖子,还要收集字节码文件比较的帖子{:soso_e182:}
作者: 郑雪    时间: 2013-4-28 09:16
class Demo1{

        public static void main(String[] args) {
                String s1 = "abc";
                String s2 = "a" + "bc";               
                System.out.println(s1);
                System.out.println(s2);
                System.out.println(s1.equals(s2));
                System.out.println(s1 == s2);
        }
    }
这里System.out.println(s1 == s2);之所以结果为true,是因为String s2 = "a" + "bc";就等于和String s2 = "abc";
因此s1和s2都指向了常量池中的“abc”。
作者: 陈迎春    时间: 2013-4-28 09:46
HM邱刚权 发表于 2013-4-28 09:03
这个问题论坛里面有很多! 其实是指向问题 第一个很简单看就是赋值不多说,
第2个
public static void main ...

你说同时指向s2和s3是怎么个指法,不会为s4分配内存空间吗?怎么理解哇,为什么变量会没有内存空间,那它存在于哪呢
作者: HM邱刚权    时间: 2013-4-28 10:05
陈迎春 发表于 2013-4-28 09:46
你说同时指向s2和s3是怎么个指法,不会为s4分配内存空间吗?怎么理解哇,为什么变量会没有内存空间,那它 ...

不会为他分配空间! 至于为什么没内存空间! 这个嘛 要问高手了!你可以看堆和饯的关系你就懂了!
作者: 高正新    时间: 2013-4-28 17:52
首先,== 是比较地址的, equals 是比较值的。
然后,String s1 = "abc";               String s2 = "a" + "bc";   因为a bc 两个都是基本的字符串,都会被存放在常量池里。 当java编译的时候,可以判断  "a" + "bc" 就是abc,所以直接将s2指向了s1所指向的那个地址。
String s1 = "abc";
                String s2 = "a";
                String s3 = "bc";
                String s4 = s2 + s3;
而这里的s4在编译的时候,因为s2 s3两个都是对象,jvm无法判断到底存放的是什么东西,运行的时候指向了堆内存中的一个地址,然后运算得出是abc。所以它们是不同的地址。
作者: cowthan    时间: 2013-4-28 20:46
s1.equals(s2)比较的是对象的值,所以只要字符串的值相等,那就相等
s1 == s2,比较的是引用的值,所以只要二者指向同一个对象,那就相等,反之,两个字符串对象即使值一样,也不能划==


作者: 阿彪    时间: 2013-4-28 21:25
  切记,如果用==做引用类型比较,那么比的就是地址值。equals()是重写Object类方法,一般用来判断两个值是否相同。




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