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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 官仁杰 中级黑马   /  2012-10-16 18:10  /  1601 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 官仁杰 于 2012-10-16 20:47 编辑

我们知道
string s1 = “abc”;
string s2 = “abc”;
s1和s2是指向同一个对象,那么对于其他类有没有这个特点呢?
即一个类的2个对象调用完全相同的构造函数,会是同一个对象吗

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
这两个对象指向同一个对象,是因为java虚拟机的享元模式设计,是非常特殊的,类似的还有Integer。

使用统一构造方法得到的对象当然是两个对象。。。。
回复 使用道具 举报
一个类的2个对象调用完全相同的构造函数 这两个对象是不同的.因为你new了2个对象肯定是不同的。
string s1 = “abc”;
string s2 = “abc”;
s1和s2是指向同一个对象。它的实现方法是使用缓存技术。当第一次执行ring s1 = “abc”;时,会将字符串对象缓存起来,
当再次执行string s2 = “abc”;时,jvm会先在缓存中找是否有abc这个字符串,如果有就直接返回对象的引用给s2,所以s1==s2

其他的类似的还有自动装箱:
   Integer num1=1;
      Integer num2=1;
      num1==num2;  //true
如果要装箱的数在 -128-127 之间,装箱后会缓存在缓存池中(注意:byte short int long char boolean适用,而float和double不行,经过本人试验)。
下次如果还有要装箱这个数会先在缓存池中找,如有的话就返回这个已经存在的。这样做节省了内存空间,因为这样的对象可能经常用到,而这些对象又是相同的。(享元模式)

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
前提:首先要知道String类在内存中有一个对应的string池;string s1 ="abc"和string s2 = new string("abc")的区别;
先分析一下string s1 = “abc”语句:首先程序会到string池中寻找是否存在"abc"这个对象,如果有的话,那么s1引用就会指向池中"abc"对象,如果没有的话,就会在在池中创建一个"abc"对象并且指向它。
然后再来分析一下String s2 =new string("abc")语句:首先程序会到string池中寻找是否存在"abc"这个对象,如果有的话,那么就在堆内存中创建一个"abc"对象并指向它;如果没有的话,就会在string池中创建一个"abc"对象,然后再到堆内存中创建一个"abc”对象并指向它。所以string s2 = new string("abc")实质上就是创建了两个对象。这就是毕老师视频中所说的string s1 =“abc”和string s2 = new string("abc")区别的原理。
转入正题,回答你的提问:按照以上理论,s1和s2都应该指向string池中的同一个"abc"对象,并没有在堆内存中创建对象,所以它们的地址值都是一样的。因为string类在内存中存在string池这个概念,所以至于其他类有没有这个情况,我回答不了(知识还没深入到那种地步^_^,抱歉啰!)。希望我的回答可以帮助到你...相互交流!{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
路过的   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马