A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hello_csu 中级黑马   /  2015-1-2 16:42  /  1504 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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存放于常量池中,因此其地址一样。

3 个回复

倒序浏览
关于常量池总结的很好,理解的很深刻,楼主肯定搞过底层的东西,好贴不得不顶。
回复 使用道具 举报
好厉害,学习了,黑马怎么收藏帖子,知道吗
回复 使用道具 举报
好详细  ,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马