字符串常量池:
首先说为什么需要字符串常量池?
那就得从字符串说起了,创建一个对象要为它付出时间和空间上的开销。字符串可以说是和8个基本数据类型一样常用的类型,甚至比8个基本类型更加常用,因此需要频繁的创建字符串对象,大量的对象对程序性能的影响非常大,所以用常量池的方式可以很大程度降低对象的创建、分配次数,从而提升性能。(JDK1.7(包括1.7) 之后,字符串常量池便从方法区移到堆中)
为什么字符串常量没有像其他对象直接存在堆中
字符串有两种创建方式:
String s1 = "abcde"; // 第一种方式
String s2 = new String("abcde"); //第二种方式
第一种方式生命字符串变量是最常用的方式,叫做字面量声明,也就是吧字符串用双引号引起来,直接赋值给一个变量。这种情况下,会直接将字符串放到字符串常量池中,然后变量只想池中的地址。
如果此时在声明一个相同的字符串,会发现在池中已经存在,则变量直接指向池中的地址
第二种方式除非有特殊的逻辑,否则不建议用
如果在new之前池中已经有了相同内容的字符串常量,首先会在堆中创建一个变量的引用对象,然后将这个引用对象指向字符串常量池中已经存在的常量
如果在new之前池中没有相同内容的字符串常量,用 new String 的方式第一次声明这个字符串,则在堆中创建一个字符串对象,然后返回给变量
544

被折叠的 条评论
为什么被折叠?



