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

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

    • 最佳实践:能用""创建字符串,就不用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. Linux系统安装和网络配置

    系统下载 CentOS 6.x 50% 6.9    ---- 常用 CentOS 7.x 50% 7.2   ----常用 官网-国外 https://wiki.centos.org/Downloa ...

  2. 【Java8】@FunctionalInterface

    阅读目录 什么是函数式接口(Functional Interface) 函数式接口用途 关于@FunctionalInterface注解 函数式接口里允许定义默认方法 函数式接口里允许定义静态方法 函 ...

  3. 关于reduce的理解

    什么是reduce reduce这个词字面上来讲,大多称作“归约”,但这个词太专业了,以至于第一眼看不出来意思.我更倾向于解释为“塌缩”,这样就形象多了.对一个n维的情况进行reduce,就是将执行操 ...

  4. Maven打包相关插件集合

    参考:https://www.cnblogs.com/selier/p/9510326.html

  5. SkylineGlobe TerraExplorer Pro 7.0 Web 控件版 第一行示例代码

    SkylineGlobe TerraExplorer Pro 7.0 是原生的64位应用程序,在Web端用插件方式开发的第一行示例代码如下: 常规代码,需要IE64位: <!DOCTYPE ht ...

  6. git branch 分支操作

    一.git分支命令 Git鼓励大量使用分支: 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创 ...

  7. mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

    目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...

  8. Linux Namespace : 简介

    在初步的了解 docker 后,笔者期望通过理解 docker 背后的技术原理来深入的学习和使用 docker,接下来的几篇文章简单的介绍下 linux namespace 的概念以及基本用法. na ...

  9. C#(.NET) HMAC SHA256实现

    HMAC SHA256的实现比较简单,可以用多种语言实现,下面我用C#语言实现,一种结果是居于BASE64,另外一种是居于64位. C# HMAC SHA256 (Base64) using Syst ...

  10. Pandas基础使用

    Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的. 1.导入pandas import pandas as pd 2.pandas数据类型: 1)Series:一维数据类型 ...