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());
        } }

    • 最佳实践:能用""创建字符串,就不用new创建。

String类内存空间详解的更多相关文章

  1. String类的构造方法详解

    package StringDemo; //String类的构造方法详解 //方法一:String(); //方法二:String(byte[] bytes) //方法三:String (byte[] ...

  2. java中的String类常量池详解

    test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[ ...

  3. java内存空间详解

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...

  4. 干货 | JavaScript内存空间详解

    JS栈内存与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所以对于前端开发 ...

  5. String类的常用方法详解

    1:获取字符串的长度length(),下标从1开始 2:将其他类型转换为String类型toStrings() 3:去除字符串首尾的空格trim() 4:分割字符串spilt() 5:比较两个字符串是 ...

  6. [转]C++结构体|类 内存对齐详解

    内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...

  7. C++字符串string类常用操作详解(一)【初始化、遍历、连接】

    代码示例: #include <iostream> #include "string" using namespace std; //字符串初始化 void strIn ...

  8. [转]c++类的构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

  9. c++类的构造函数详解

    c++类的构造函数详解 一. 构造函数是干什么的 class Counter{ public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类 ...

随机推荐

  1. C++ 入门[1]

    C++编译与执行 主存又称为寄存器,在CPU旁边, 随机访问储存器RAM 即内存

  2. js 常用的比较排序算法总结

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚, ...

  3. Python:Day35 mysql基础

    一.数据库管理系统DBMS 软件,存储数据 认证,授权,限制 SqlServer --- 微软(收费) Oracle,sqlite,access...MySQL 服务端和客户端 想要使用MySQL来存 ...

  4. Rsync服务实战

    目录 1 安装rsync软件 2 配置 /etc/rsyncd.conf 3 创建用户(运行rsync服务的用户身份) 4 创建虚拟用户密码文件(客户端连接时候使用) 5启动 rsync 服务,并加入 ...

  5. PyCharm 中使用 Pylint 控制代码质量

    1) Pylint安装 - Windows下: 直接在 cmd 下使用 pip install pylint 即可(如果 pip 不可用,首先安装最新版 Python,会默认安装 pip,或者找到 p ...

  6. 漏洞扫描,linux配置规范处理

    #!/bin/bash ## set shortest length of password filename=/etc/login.defs if [ -f "$filename" ...

  7. mysql远程连接 Host * is not allowed to connect to this MySQL server

    mysql -u root -p mysql>use mysql; mysql>update user set host =’%'where user =’root’; mysql> ...

  8. .net core实践系列之短信服务-架构优化

    前言 通过前面的几篇文章,讲解了一个短信服务的架构设计与实现.然而初始方案并非100%完美的,我们仍可以对该架构做一些优化与调整. 同时我也希望通过这篇文章与大家分享一下,我的架构设计理念. 源码地址 ...

  9. ASP.Net Core 运行错误 Http Error 502.5 解决办法

    Http Error 502.5 - Process Failure 如果你看到上面这张图片了的话,说明你在本地运行的时候报错了. 尤其好多都是我的群友,说下情况. 这个一般是本地的.NET Core ...

  10. 微信小程序开发平台新功能「云开发」快速上手体验

    微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...