黑马程序员技术交流社区

标题: String引出的常量池概念 [打印本页]

作者: hello_csu    时间: 2015-1-2 16:42
标题: String引出的常量池概念
本帖最后由 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存放于常量池中,因此其地址一样。
作者: kerner    时间: 2015-1-2 17:30
关于常量池总结的很好,理解的很深刻,楼主肯定搞过底层的东西,好贴不得不顶。
作者: 刘挺    时间: 2015-1-2 18:36
好厉害,学习了,黑马怎么收藏帖子,知道吗

作者: 红楼    时间: 2015-1-2 21:53
好详细  ,,,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2