在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完全是两个对象,只不过它们的值相同而已

最新文章

  1. MySql怎样去掉某个字段最后的逗号或最后的字
  2. .NET平台开发Mongo基础知识
  3. php中创建和调用webservice接口示例
  4. HDU 2795 Billboard (线段树)
  5. 写一个TT模板自动生成spring.net下面的配置文件。
  6. OAuth2.0认证过程
  7. Oracle 创建索引的基本规则总结
  8. 前后端分手大师——MVVM 模式
  9. 给我一台全新的服务器,使用nginx+gunicorn+supervisor部署django
  10. 全文检索 Lucene(3)
  11. Vue Input输入框两侧加减框内数字组件
  12. Python学习—基础篇之基本数据类型(二)
  13. awk简单用法-(1)
  14. 新部署tomcat,An error occurred at line: [1] index_jsp.java
  15. vs2010中关于HTML控件与服务器控件分别和js函数混合使用的问题
  16. 如何解析oracle执行计划
  17. java.net.SocketException: Broken pipe
  18. 【最简单】不用ps也可以批量转换图片格式
  19. Ubuntu 12.04 安装配置 Apache2
  20. 记录一次nginx502/504问题解决过程

热门文章

  1. 如何打开DOS控制台
  2. Python - 排序( 插入, 冒泡, 快速, 二分 )
  3. Google Protocol Buffers 快速入门(带生成C#源码的方法)
  4. RedHat Enterprise7 搭建ISCSI
  5. golang channel详解和协程优雅退出
  6. SpringBoot: 1.创建第一个SpringBoot项目(转)
  7. Openstack架构及配置
  8. 安装gnocchi
  9. 【ARM-Linux开发】Linux环境下使用eclipse开发C++动态链接库程序
  10. 【VS开发】【C/C++开发】传递双重指针申请内存,典型用法