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. 什么是数据库ACID?

    原子性:由于操作失败导致的数据碎片错误: 一致性:由于并发导致的数据库数据错误(与预期不一致): 隔离性:由于并发导致的当前使用数据(应用端)错误: 事务在当今的企业系统无处不在,即使在高并发环境下也 ...

  2. CSAPP:信息的表和处理2

    CSAPP:信息的表和处理2 关键点:浮点数.浮点数运算. 二进制小数IEEE浮点数表示浮点数转换(单精度)参考 二进制小数   形如表示的二进制数,其中每个位的取值范围位0和1.这种表示方式的定义如 ...

  3. WPF DataGrid 列宽填充表格方法

    WPF中使DataGrid 列宽填充表格方法,设置ColumnWidth属性为ColumnWidth="*"即可. 源码: <DataGrid AutoGenerateCol ...

  4. Apache 2.4.27 局域网访问提示 You don't have permission to access / on this server

    问题: 本机用localhost和ip都可以访问,局域网不可以访问,并且出现提示 You don't have permission to access / on this server. 解决: 如 ...

  5. 20175330 实验一 《Java开发环境的熟悉》实验报告

    一.实验内容及步骤 (一)使用JDk编译.运行简单的Java程序 (一)使用JDk编译.运行简单的Java程序 输入cd Code命令进入Code目录 输入mkdir 20175308建立实验目录 l ...

  6. 用ASP.NET MVC仿站糗事百科

    废话就不多说,直接来操作,有些细节问题就不一一解说了(没有几天几夜都说不完),主意是想让大家看完知道大概这个框架是怎么搭建的就可以了 一. 新建一个解决方案,搭建三层架构,分别为: DAL层  .DL ...

  7. 快速搭建日志系统——ELK STACK

    什么是ELK STACK ELK Stack是Elasticserach.Logstash.Kibana三种工具组合而成的一个日志解决方案.ELK可以将我们的系统日志.访问日志.运行日志.错误日志等进 ...

  8. Docker镜像存储-overlayfs

    一.概述 Docker中的镜像采用分层构建设计,每个层可以称之为“layer”,这些layer被存放在了/var/lib/docker/<storage-driver>/目录下,这里的st ...

  9. mysql的模糊匹配

    实例: SQL模糊查询,使用like比较关键字,加上SQL里的通配符,请参考以下: 1.LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden). 2.LIKE'%inger' ...

  10. heb Daz

    Asatras soi bib Daz! gos la haik ri, dewoa gos mi haik quri. soi Fong d cuup va ti Chusan, imps Dabo ...