1 String str1 = "ABC"; java
1 String str2 = new String("ABC"); 优化
String str1 = “ABC”;可能建立一个或者不建立对象,若是”ABC”这个字符串在java String池里不存在,会在java String池里建立一个建立一个String对象(“ABC”),而后str1指向这个内存地址,不管之后用这种方式建立多少个值为”ABC”的字符串对象,始终只有一个内存地址被分配,以后的都是String的拷贝,Java中称为“字符串驻留”,全部的字符串常量都会在编译以后自动地驻留。spa
String str2 = new String(“ABC”);至少建立一个对象,也可能两个。由于用到new关键字,确定会在heap中建立一个str2的String对象,它的value是“ABC”。同时若是这个字符串再java String池里不存在,会在java池里建立这个String对象“ABC”。code
在JVM里,考虑到垃圾回收(Garbage Collection)的方便,将heap(堆)划分为三部分:young generation(新生代)、tenured generation (old generation)(旧生代)、permanent generation(永生代)。对象
字符串为了解决字符串重复问题,生命周期长,存于pergmen中。blog
JVM中,相应的类被加载运行后,常量池对应的映射到JVM运行时的常量池中。生命周期
考虑下面的问题:内存
1 String str1 = new String("ABC"); 2 String str2 = new String("ABC"); 3 4 str1 == str2 //false
1 String str3 = "ABC"; 2 String str4 = "ABC"; 3 String str5 = "AB" + "C"; 4 5 str3 == str4 //true 6 str3 == str5 // true
1 String a = "ABC"; 2 String b = "AB"; 3 String c = b + "C"; 4 5 a == c //false
a、b在编译时就已经被肯定了,而c是引用变量,不会在编译时就被肯定。字符串
应用的状况:建议在平时的使用中,尽可能使用String = “abcd”;这种方式来建立字符串,而不是String = new String(“abcd”);这种形式,由于使用new构造器建立字符串对象必定会开辟一个新的heap空间,而双引号则是采用了String interning(字符串驻留)进行了优化,效率比构造器高。io
再问,int[]的初始化在俩种状况下有区别么?