在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 字符串常量_Java字符常量详解相关推荐

  1. java method 注解_JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...

  2. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

  3. java 字符串 常量_Java进阶——Java中的字符串常量池

    字符串常量池 JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内存,这段内存被成为字符串常量池(方法区中).实际上还有整型常量池.浮点型常量池等等.字符串常量池存放的是对象的引用,而不是对象 ...

  4. java泛型 初始化_Java泛型详解

    概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有 ...

  5. java递归函数例子_Java递归函数详解附案例

    递归函数在Java语言中得到了广泛的应用,它使得程序的编写过程更加的清晰明了.对Java初学者来讲,递归函数是需要学习的一个重要知识点.本文将附上案例和演示代码,具体为大家介绍递归函数的概念.要素以及 ...

  6. Java注解库_Java 注解详解

    本文部分摘自 On Java 8 基本语法 注解是 Java 5 所引入的众多语言变化之一,是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影 ...

  7. java内部类选择题_java内部类详解(附相关面试题)

    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟. 一.内 ...

  8. java邮箱正则表达式_Java正则表达式详解

    亲爱的小伙伴们,本期我们讲解java中的正则表达式和它相关的一些类与方法. 概述 正则表达式非常强大,能够解决我们开发时用于匹配一些特定的要求.并且java中还提供了相当强大的方法,扩展其功能性.下面 ...

  9. java正则表达式原理_Java 正则表达式详解

    摘自:http://www.jb51.net/article/16829.htm 许多语言,包括 Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些 ...

  10. java生日正则表达式_Java正则表达式详解

    如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单.如果你不熟悉这个术语,那么"正则表达式"(Regular Expres ...

最新文章

  1. 关于Java为什么配置好环境变量但是不能在命令行cmd运行javac的问题
  2. 曲线均匀分布_R——概率统计与模拟(三) 变换均匀分布对特定分布进行抽样
  3. Java与汽车_Java NIO:IO与NIO的区别
  4. php的yii简介,yii
  5. python实训目的意义_Python实训第二天--基础知识2
  6. MySQL Encryption and Compression Functions(加密)
  7. semaphore性能问题_SQL Server性能调整– RESOURCE_SEMAPHORE等待
  8. 【前端】【cornerstone】cornerstone.js如何编辑图像/加载已有图像数据(以画直线为例)
  9. 基于虚拟帐号的邮件系统extmail(1)
  10. STM32:GPIO配置说明
  11. 【Spring学习笔记-0】Spring开发所需要的核心jar包
  12. 并发编程学习之Callable接口
  13. 超详细的微信公众号创建与管理教程
  14. c语言中while循环语句的作用,while和do while循环,C语言while和do while循环详解
  15. 【Python】【C语言】P3353 在你窗外闪耀的星星
  16. msvcr120.dll丢失如何修复
  17. 金田一少年の怪奇事件部
  18. unity 在移动平台中,文件操作路径详解
  19. linux下SCP无密码传输(建立互信关系)
  20. cad指北针lisp_auto cad指北针图块下载|CAD指北针

热门文章

  1. 对数坐标归一化_数据标准化/归一化方法(Normalization Method)汇总
  2. div圆角,阴影效果。
  3. ERP流程一 总体说明
  4. c# rar解压大小_C# 利用WinRAR (加密)压缩及解压缩
  5. java离职证明模板word_离职证明模板Word免费版下载
  6. 个别计价法、先进先出法、加权平均法、移动加权平均法解读
  7. 加权平均数的例子_加权平均法举例说明
  8. Pyspider 框架的用法
  9. ZZULIOJ1071-1075Python解法
  10. 用易语言开发的ffmpeg转码工具