在Java程序中经常会遇到类似于"Hello"这样地字符串,那么这种类型的字符串是Java中是如何存储,下面就说明字符串常量在内存中存储方式:

  Java程序在编译时会将程序中出现的常量(包括:char、byte、short、int、long、boolean和String类型)放到一个叫做常量池的地方。常量池也称为对象池,顾名思义  常量池中存储的是对象。

  那么在源程序中检测到"Hello"这样地常量字符串之后,编译器都干了些什么:

  首先,在常量池中创建一个String对象,该对象的内存分布如下图:

  

  这里就需要提一下String定义的两个变量:

  private final char value[];    //The value is used for character storage

  private int hash;  //Cache the hash code for the string

  其中第一个就是实际存储字符串的数组,所有字符串最终的存储形式都是字符数组。从上图中可以很清晰的看出,实际的字符数组还是存储在堆中,常量池中存储的是String对象。

  当执行String str = "Hello",只是将常量池中"Hello"对象的地址赋给了str。

  除了上面这个字符串常量的内存模型需要理清之外,String类还有几个很常用的构造函数,也需要对内存模型非常熟悉:

  1. public String() {

    this.value = "".value;

  }

  这是默认的构造函数,它将一个空串的字符数组引用赋给了本类的数组数组引用,所以这个String对象中什么也没有当然这样做并没有什么好处,因为String对象一但创建便不可更改其内容(从value的修饰关键字final可以看出)。

  2.  public String(String original) {

    this.value = original.value;

    this.hash = original.value;

  }

   这里只是简单的复制了引用的值,并没有复制引用的内容,它们仍然指向同一个对象。

  3. public String(char value[]) {

    this.value = Arrays.copyOf(value, value.length);

  }。

  Array.copyOf()会将value中的值重新拷贝一份出来,所以this.value和参数中的value完全是两个对象,只不过它们的值相同而已

java字符常量的更多相关文章

  1. java 字符常量池

    一.题目: 问题:String str = new String(“hello”),“hello”在内存中是怎么分配的?    答案是:堆,字符串常量区. Java中的字符串常量池和JVM运行时数据区 ...

  2. 关于Java正则和转义中\\和\\\\的理解

    定义 一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义. 转义就是指转换该字符的原本意义,从而变成另外的意义. \作为Java的转义字符 1.在j ...

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. 字符常量 java

    从Java语言的定义,ABCD都是错误的,4个都不是正确的字符常量.可以查阅<JLS8>中的描述: A character literal is expressed as a charac ...

  5. Java 经典入门(一)

    一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...

  6. 【搬砖】安卓入门(2)- Java开发编程基础--进制转换和运算符

    02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 ...

  7. Java基本数据类型总结

    基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型.java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. 1. Java ...

  8. java基本数据类型

    基本数据类型概念 java是一种强类型语言,意味着必须为每一个变量声明一种数据类型. java拥有8中基本数据类型,主要包含如下:4中整形类型(long.int.short.byte)表示整形数值:两 ...

  9. [Java入门笔记] Java语言基础(二):常量、变量与数据类型

    常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字.常量还可以分为两种意思: 第1种意 ...

随机推荐

  1. mybatis工作流程

    1)通过Reader对象读取src目录下的mybatis.xml配置文件(该文本的位置和名字可任意) 2)通过SqlSessionFactoryBuilder对象创建SqlSessionFactory ...

  2. mysql 截取字符函数substring(param1,param2,param3) 的用法

    substring(paramter1,paramter2,paramter3) 截取字段长度 paramter1  被截取的字段paramter2 从第几位开始截取,负数表示从末尾开始数,的位数开始 ...

  3. Kafka offset机制

  4. jenkins中使用shell脚本必须切换jenkins用户

    https://blog.csdn.net/cdnight/article/details/81078191 安装这篇解决的 正确使用脚本的方式: 1.脚本必须使用jenknins用户,且所有命令必须 ...

  5. LeetCode.1217-交换芯片(Play with Chips)

    这是小川的第次更新,第篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第270题(顺位题号是1217).There are some chips, and the i-th ch ...

  6. 如何让FasterTransformer支持动态batch和动态sequence length

    FasterTransformer 算子 nvidia在开源的FasterTransformer的代码中,提供tensorrt和tensorflow的自定义算子编译和py调用示例,详见FasterTr ...

  7. 【miscellaneous】海康威视监控摄像头实现web端无插件监控实拍效果

    [rtsp]海康威视监控摄像头实现web端无插件监控实拍效果 详细介绍参见:http://live.cuplayer.com/RtspCameraLive.html web端无须装插件(支持PC,安卓 ...

  8. 【VS开发】uafxcwd.lib(afxmem.obj) : error LNK2005: 已经在 LIBCMTD.lib(new.obj) 中定义错误解决方案

    如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...

  9. 【并行计算-CUDA开发】有关CUDA当中global memory如何实现合并访问跟内存对齐相关的问题

    ps:这是英伟达二面面的一道相关CUDA的题目.<NVIDIA CUDA编程指南>第57页开始          在合并访问这里,不要跟shared memory的bank conflic ...

  10. 用maven建立一个工程

    建立java工程 mvn archetype:generate -DgroupId=cn.maxhou.demo -DartifactId=myapp -DarchetypeArtifactId=ma ...