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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© て淡莣了陌生 中级黑马   /  2013-4-28 08:47  /  1768 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 て淡莣了陌生 于 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呢,不理解,求解释!!!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

11 个回复

倒序浏览
这个问题论坛里面有很多! 其实是指向问题 第一个很简单看就是赋值不多说,
第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;
回复 使用道具 举报
System.out.println(s1.equals(s4));//结果为true。equals只是比较他们的值想不想等。
                             //s1的值是"abc",s4的值也是"abc".
  System.out.println(s1 == s4); //比较引用地址值。s1是调用常量池中的字符串"abc";
                            //而s4是不能在编译期就确定下来。不能引用常量池中的"abc"字符串。
                            //所以输出false
回复 使用道具 举报
==    是比较两个对象的地址是否相同 也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等
equals是用于比较两个独立对象的内容是否相同。
java一般都是值传递,所以你
String s2 = "a" + "bc";   
和这样      
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
本质是一样的!
回复 使用道具 举报
==    是比较两个对象的地址是否相同 也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等
equals是用于比较两个独立对象的内容是否相同。
java一般都是值传递,所以你
String s2 = "a" + "bc";   
和这样      
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
本质是一样的!
回复 使用道具 举报
这样的问题确实有很多,众说纷纭,我跟楼主同求{:soso_e120:}

我要手机这样的帖子,还要收集字节码文件比较的帖子{:soso_e182:}
回复 使用道具 举报
郑雪 中级黑马 2013-4-28 09:16:08
7#
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:18
8#
HM邱刚权 发表于 2013-4-28 09:03
这个问题论坛里面有很多! 其实是指向问题 第一个很简单看就是赋值不多说,
第2个
public static void main ...

你说同时指向s2和s3是怎么个指法,不会为s4分配内存空间吗?怎么理解哇,为什么变量会没有内存空间,那它存在于哪呢
回复 使用道具 举报
陈迎春 发表于 2013-4-28 09:46
你说同时指向s2和s3是怎么个指法,不会为s4分配内存空间吗?怎么理解哇,为什么变量会没有内存空间,那它 ...

不会为他分配空间! 至于为什么没内存空间! 这个嘛 要问高手了!你可以看堆和饯的关系你就懂了!
回复 使用道具 举报
首先,== 是比较地址的, 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。所以它们是不同的地址。
回复 使用道具 举报
s1.equals(s2)比较的是对象的值,所以只要字符串的值相等,那就相等
s1 == s2,比较的是引用的值,所以只要二者指向同一个对象,那就相等,反之,两个字符串对象即使值一样,也不能划==

回复 使用道具 举报
  切记,如果用==做引用类型比较,那么比的就是地址值。equals()是重写Object类方法,一般用来判断两个值是否相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马