zoukankan      html  css  js  c++  java
  • Java中String字符串常量池

      首先看一个例子,通过这个例子更能快速理解String常量池

     1 public static void main(String[] args) {
     2 
     3         String a = "ab";
     4         String bb = "b";
     5         String b = "a" + bb;
     6         String c = "a" + "b";
     7         String d = b.intern();
     8 
     9         System.out.println(a == b);
    10         System.out.println(a == c);
    11         System.out.println(a == d);
    12 }

      运行结果如下:

    1 false
    2 true
    3 true

      这是为什么呢,String类的final修饰的,以字面量的形式创建String变量时,jvm会在编译期间就把该字面量(“ab”)放到字符串常量池中,由Java程序启动的时候就已经加载到内存中了。这个字符串常量池的特点就是有且只有一份相同的字面量,如果有其它相同的字面量,jvm则返回这个字面量的引用。当我们创建String对象采用字面量形式时,JVM首先会对这个字面量进行检查,如果常量池中存放有该字面量,则直接使用,所以a == c为ture,否则创建新的对象并将其引用放入常量池中,所以 a == b 为false。b.intern()方法能使一个位于堆中的字符串在运行期间动态地加入到字符串常量池中(字符串常量池的内容是程序启动的时候就已经加载好了),所以a == d为ture。

    ----String常量池---- 

    1.常量池中的对象从哪里来的?
    当我们创建String对象采用字面量形式时,JVM首先会对这个字面量进行检查,如果常量池中存放有该字面量,则直接使用,否则创建新的对象并将其引用放入常量池中。
    当我们通过new来创建一个字符串时,JVM就不会去常量池中找,而是直接在堆中新建一个对象。如果我们想把new的对象也放在常量池中,可以调用方法inner();
    2.常量池中存的是对象还是引用?
    常量池中存的是对对象的引用,存储于JVM的方法区中,而且引用的对象存储于堆中。
    3.常量池中的对象会被GC回收吗?
    当常量池中的引用没有被任何变量引用时,就会被GC回收!

    
    
  • 相关阅读:
    关于json字符串与实体之间的严格验证
    SQL Pretty Printer 一款值得你拥有的MSSQL格式化插件
    ABP增加记录EFCore 生成数据库脚本日志到新的txt文件
    Multiple types were found that match the controller named 'Auth'.
    sqlserver 交叉去重
    sqlserver分组排序取前三条数据
    C# 读取.resx资源文件写入到json文件中
    SqlServer根据经纬度排序
    .net core 简单定时程序
    使用游标,查询一张的数据往另外三张表里面添加数据
  • 原文地址:https://www.cnblogs.com/nfex/p/10496690.html
Copyright © 2011-2022 走看看