【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
以上全是个人理解,如果不对请指正,谢谢
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
以上全是个人理解,如果不对请指正,谢谢
相关文章推荐
- JAVA基础之再次解读String-创建几个对象
- 【Java基础一】String创建对象"" && null
- java基础复习之对于String对象,能够使用“=”赋值,也能够使用newkeyword赋值,两种方式有什么差别?
- Java基础:创建String对象时,String s=new String("abc")和String s="abc"的区别
- 第2章 Java编程基础——FAQ2.22 创建String对象时, 使用String s=new String (“abc”)和String s=“abc”语句有什么区别?
- java语言基础(53)——String 字面值对象和构造方法创建对象的区别
- Java基础(11):字符串—深入理解String对象和比较符==和equals的不同
- Java基础复习String对象创建的分析
- 3.Java基础:String对象的创建和使用
- (原创)深入研究java对String字符串对象的创建以及管理
- JAVA面试题解惑系列(二)――到底创建了几个String对象?
- JAVA面试题解惑系列——到底创建了几个String对象?
- JAVA面试题解惑系列(二)——到底创建了几个String对象?
- JAVA面试题解惑系列(二)——到底创建了几个String对象?
- 深入研究java对String字符串对象的创建以及管理
- JAVA面试题解惑系列(二)——到底创建了几个String对象?
- JAVA面试题解惑系列(二)——到底创建了几个String对象?
- 关于Java String对象创建问题解惑
- JAVA面试题解惑系列(二)——到底创建了几个String对象?
- JAVA解惑---String创建了几个对象