本帖最后由 hello_csu 于 2015-1-2 16:44 编辑
1, 常量池的概念
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。其中Byte, Short, Integer, Long, Character, Boolean,String都可以实现常量池。都数据存放于常量池的时候,其值存放一份拷贝。
2, JVM在常量池中查找数据
如String值存放于常量池中,那么先去查找,如果找到了,那么就不会添加同样的String。如果找不到话,才会去创建添加。
3, 什么样格式的数据存放于常量池,
例如
String s = "a" + "b" +"c";
String s1 = "abc";
s,s1都存放于常量池中,
从上面推理,其一般格式:Reference type=Const Value 这种形式的,其存放于常量池中,这有这样子才能够编译阶段就确定了该值变量。
4,String一些基本操作解析
sample1: String s1 = "a" + "b"+ "c"; String s2= "abc";
s1==s2 ,因为实际上s1,s2都存放于常量池中,只保存一份备份。
sample 2: String s1 = "a" + "b"+ "c"; String s2= "ab"; String s3 = s2 + "c";
s1 != s3为真的,因为s1放在常量池中,而s3不存放于常量池(编译期间不确定值,需要运行时候动态分配空间),所以地址不一样。
sample 3: String s1 = "a" + "b"+ "c"; final String s2= "ab"; String s3 = s2 + "c";
s1 == s3,因为s2有final修饰,那么编译器阶段其就会被替换为"ab",所以s3存放于常量池中,因此其地址一样。 |
|