我们经常在Java里面提到String的不变性,下面就来说一下对于String的不变性的理解:
可以参考以下程序:
String str = "Hello"; System.out.println(str);//输出为Hello str.concat("World");//该方法是在原来的变量后面添加一个字符串然后变成新的字符串 System.out.println(str);//输出为Hello str=str.concat("World"); System.out.println(str);//输出为HelloWorld
常量池概念:
在Java虚拟机的整个体系里面,我们加载类文件,分别存放到不同的单元,占用大部分内存空间的是常量池,大约能占到60%,为了节省内存,JVM专门用一片特殊的存储区域存储String,作为String ,面对String常量,会检查String常量池中是否存在此常量,如果存在的话,直接进行引用,避浪费多余的内存空间,因此必须确保这个具体的常量不能变,这就是我们经常讲的String的不变性。
我们可以联想到其它方式,还有其它使用的技术:
String newStr=“java”;//这个应该是放在String的常量池中的常量。
String newStrObj=new String("java");//这个放在常规的内存中。
在开发Eclipse插件中曾经使用过Java jet技术,用来动态生成代码,它就是提取常量方便生成代码,和java的处理很类似。