• String类内存空间详解


    java.lang.String类内存问题详解

    • 字符串理解的难点在于其在堆内存空间上的特殊性,字符串String对象在堆内存上有两种空间:
      1. 字符串池(String pool):特殊的堆内存,专门存放String对象,且不会有重复的值。
      2. 普通堆内存空间:此处的String对象一般是通过调用new操作符得到。
    • 两种字符串内存空间处理字符串的优先级关系:
      • 字符串池(String pool)对普通堆内存空间说:
        1. 凡是你拥有的、且不管你同样的内容有多少份,我一定会只会保存一份;
        2. 我有的,你不必一定拥有。
          public class StringPool {
              
              public static void main(String[] args) {
                  //只会在字符串池创建一份“aaa”,str1指向字符串池中的某个地址
                  String str1 = "aaa";
                  
                  //先在字符串池创建一份“bbb”,然后听从new的指示,在普通堆内存开辟空间存储一份“bbb”
                  //str2指向普通堆内存空间上的一个地址
                  String str2 = new String("bbb");
                  //字符串池心里已经有了"bbb",不会再有第二份了。但是new还是要在普通内存空间存一份“bbb”
                  String str3 = new String("bbb");
                  
                  // == 比较的是否是同一个对象(内存地址是否一样)
                  // str.intern(),返回一个字符串池里的、和当前str的值equals的字符串的地址引用
                  System.out.println(str1 == "aaa".intern());
                  
                  System.out.println(str2 == "bbb".intern());
                  
                  //new调用一次,开辟一次普通内存空间
                  //但不论new多少次,相同value的字符串,字符串池只存一份
                  System.out.println(str2 == str3);
                  System.out.println(str2.intern() == str3.intern());
              }
          
          }
          View Code

           

      • 最佳实践:能用""创建字符串,就不用new创建。
  • 相关阅读:
    Hadoop-03 基于Hadoop的JavaEE数据可视化简易案例(升级使用HBase存储结果集)
    Hadoop-02 基于Hadoop的JavaEE数据可视化简易案例
    Python03 变量
    Python01 VSCode开发环境和入门程序
    MyBatis01 Idea中搭建MyBatis开发环境
    Idea01 Idea2018中集成Tomcat9导致OutPut乱码
    MySQL-08 MySQL8.0新特性
    C11 C语言文件的读写
    C10 C语言数据结构
    C09 指针
  • 原文地址:https://www.cnblogs.com/InformationGod/p/9471450.html
Copyright © 2020-2023  润新知