黑马程序员技术交流社区

标题: 关于string类 [打印本页]

作者: 官仁杰    时间: 2012-10-16 18:10
标题: 关于string类
本帖最后由 官仁杰 于 2012-10-16 20:47 编辑

我们知道
string s1 = “abc”;
string s2 = “abc”;
s1和s2是指向同一个对象,那么对于其他类有没有这个特点呢?
即一个类的2个对象调用完全相同的构造函数,会是同一个对象吗
作者: 张 涛    时间: 2012-10-16 18:16
这两个对象指向同一个对象,是因为java虚拟机的享元模式设计,是非常特殊的,类似的还有Integer。

使用统一构造方法得到的对象当然是两个对象。。。。
作者: 郑世光    时间: 2012-10-16 18:35
一个类的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不行,经过本人试验)。
下次如果还有要装箱这个数会先在缓存池中找,如有的话就返回这个已经存在的。这样做节省了内存空间,因为这样的对象可能经常用到,而这些对象又是相同的。(享元模式)
作者: 彭旭文    时间: 2012-10-16 18:59
前提:首先要知道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:}
作者: 杨华东    时间: 2012-10-16 19:08
路过的   




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