在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. UI布局属性大全

    第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:la ...

  2. Swagger介绍及使用

    相信无论是前端还是后端开发,都或多或少地被接口文档折磨过.前端经常抱怨后端给的接口文档与实际情况不一致.后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新.其实无论是前端调用后端,还是后端调用 ...

  3. 又做了个新的Blog

    http://inkhin.com 服务器比较渣,访问不了的请见谅.

  4. 【科普杂谈】IP地址子网划分

    1.学习子网前的准备知识-什么是数制 现场讲解版 二进制和十进制的关系   二进制和十六进制的关系  16进制的每个位是2进制的4位 F=1111  二进制转16进制,按上面4位一组分开转 2.IP地 ...

  5. 阿里云服务器 lnmp安装流程

    nginx安装:wget http://nginx.org/download/nginx-1.12.2.tar.gztar zxvf nginx-1.12.2.tar.gzcd nginx-1.12. ...

  6. [转帖]java注解与注释注解区别

    https://baijiahao.baidu.com/s?id=1615942718081024481&wfr=spider&for=pc 还需要仔细看一下书的 书里面都有. jav ...

  7. vue 事件中的 .native

    vue组件添加事件@click.native native是什么? .native - 监听组件根元素的原生事件. 主要是给自定义的组件添加原生事件. 官网的解释: 你可能想在某个组件的根元素上监听一 ...

  8. Java基础 面试总结(一)

    一.java基础篇-概念 1.简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机( ...

  9. 初识WSGI接口

    WSGI WSGI全称为Web Server Gateway Interface,WSGI允许web框架和web服务器分开,可以混合匹配web服务器和web框架,选择一个适合的配对.比如,可以在Gun ...

  10. 你懂什么是分布式系统吗?Redis分布式锁都不会?

    分布式系统涉及到很多的技术.理论与协议,很多人也说,分布式系统是“入门容易,深入难”,有一些人简历上写着熟悉分布式系统,很多人都是管中窥豹只见一斑. 究竟什么是分布式系统? 分布式系统是由一组通过网络 ...