您的位置:首页 > 编程语言 > Java开发

【JAVA基础】 - 对于String创建对象的理解

2016-09-23 10:25 337 查看
1.String s1="abc",

2.String s2 = new String("abc");

3.String s3 = "a" + "bc";

4.String s4 = "a";

   String s5 = s4 + "bc";

以下见解为个人理解,如有错误,请指正,不胜感激。

如网上资料所说,s1和s3最多只会创建1个对象,而s2和s4则最少会创建一个对象。原因如下:

首先一点,s1,s2,s3,s4这4个变量只不过是4个引用变量,它们只是在栈上开辟的一段用于保存对象地址的内存空间,讨论创建了几个对象的时候与它们无关,不用考虑它们。(这点是我自己的理解,不知道对否)

然后,JAVA是使用池来管理string类型的字符串的,相同的串在池里只可能出现一个

1情况下,如果池里没有"abc“这个字符串的话,会创建一个新的,否则的话就直接用池里已经有的。所以说它最多只会创建一个对象出来

2情况下,不管池里有还是没有“abc”,new String操作必然会现在堆里创建出来一个对象(网上说的2情况至少会创建一个对象,指的就是这个对象)。然后池里有“abc”的话就不创建,没有的话再创建一个“abc”对象,再把池里这个"abc"对象赋值给堆中新创建出来的那个对象。

3.情况下,因为直接是字符串连接。根据JVM的工作原理,它会直接把"a"和"bc"两个字符串合成“abc”,然后去池里找有没有abc这个对象,所以它的情况实际上跟1是一样的(具体原理不清楚,从网上的资料看,JVM就是这么做的)

4情况下,跟3就不一样。因为在4的情况下s5已经变成了一个变量和池里的字符串常量做合并操作,所以按照我的理解,最多的情况,应该是"a","bc"和"abc"可能会各产生一个对象。最少的情况也会创建一个,因为s4+"bc"操作是一个变量+常量的操作,必然会产生一个新的对象出来

然后再看比较:

s1==s2,可以发现,s1在池里,s2在堆里,不是同一个对象,所以就false了

s1==s3,可以发现,实际上s1和s3指向的都是池里的那个“abc”常量,所以就true了

s1==s4,可以发现,情况跟s1==s2差不多,它们已经不是指向同一个对象了,所以也false了

那s2==s4呢?很明显也是两个不同对象,所以也是false

以上全是个人理解,如果不对请指正,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: