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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© quick3g 中级黑马   /  2014-12-3 15:01  /  1549 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1="haha";
String s2="haha";
String s3="ha"+"ha";
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s1==s3);//此处为何:true呢?

假设有一个类:
class Book{
        public int id=0;
        public String name="itheima";
}

两个方法:
public static Book changeBook1(Book b){
                b.id=2;b.name="itcast";
                return b;
}
public static Book changeBook2(Book b){
                b=new Book();
                b.id=3;b.name="CSDN";
                return b;
}

                  //测试:
                 Book b0=new Book();
                 System.out.println("book.id="+b0.id+"\tbook.name="+b0.name);//初始化后的Book对象
                 Book b1=changeBook1(b0);//更改Book对象的值
                 System.out.println("book.id="+b0.id+"\tbook.name="+b0.name);
                 System.out.println(b0==b1);//此处为何为true???
                 Book b2= changeBook2(b0);//更改Book对象的值
                 System.out.println("book.id="+b0.id+"\tbook.name="+b0.name);
                 System.out.println(b0==b2);//此处为何为false???

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

10 个回复

正序浏览
杨佳名 发表于 2014-12-4 00:37
http://bbs.itheima.com/thread-152431-1-1.html好像都没说到点子上。。。希望对你有帮助 ...

很详细,谢谢。:),

点评

早点休息了。  发表于 2014-12-4 02:01
回复 使用道具 举报
http://bbs.itheima.com/thread-152431-1-1.html好像都没说到点子上。。。希望对你有帮助
回复 使用道具 举报
String s1="haha";在字符串常量池中建立一个内容为hahad的对象,s1指向该地址
String s2="haha";字符串中常量池已经有一个内容为hahad的对象,不在建立新的对象,s2指向该地址
String s3="ha"+"ha";两个字符串合并成一个新的字符串,在字符串常量池中已有,不再创建,s3同上
所以,s1,s2,s3指向了同一个对象
b0==b1,在调用changeBook1方法的时候,传进去的是第一个对象的地址值,在该对象身上进行了赋值操作,再把该对象的地址值赋给了b1,虽然对象内容改变了,但地址值没变。
b0==b2,在changeBook2中,虽然传入了第一个对象的地址值,但新建了一个对象后覆盖了该地址值(被调用的函数内的形参改变了,调用者的实参没有改变),这样就是在新的对象上进行操作,最后把新对象的地址值赋给了b2,这样b2和b0指向了不同的对象。

点评

从一本书上得知,java在处理引用类型时会优先使用堆区已经存在的对象,除非使用new关键字或新对象,才会新开辟一块内存。所以s1,s2,s3;b0,b1指针相同  发表于 2014-12-4 01:55
回复 使用道具 举报 1 0
我看字符串发现一个技巧,就是记住这句话, “ 字符串在定义后无法被改变 ”,就能解决很多问题了。像楼主问的“ha"+"ha"==“haha”.是不是可以这样想 ,因为“ha”+“ha”生成了一个新字符串,但是这个字符串在内存里又已经有了,所以s3就自动使用了“haha”在内存中的地址值,所以s1==s3就为true了。

点评

有道理。  发表于 2014-12-4 01:59
回复 使用道具 举报
+号是连接符吧,把两个ha连在了一起
回复 使用道具 举报
在字符串中的 + 指的是将两端字符串连起来。这里的 + 不同平时我们使用的 +,

字符串中的 + 的使用:
      " I love u !!!!"      = "I love" +" u !!!!"

只是一个连接的作用。

如果字符串很长很长,那么,用+可以实现换行,这样代码更加具有阅读性。
回复 使用道具 举报
在字符串中的 + 指的是将两端字符串连起来。这里的 + 不同平时我们使用的 +,

字符串中的 + 的使用:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马