java 字符串常量_Java字符常量详解
在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字符常量详解相关推荐
- java method 注解_JAVA 注解详解及简单实例
JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档 这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...
- 泛型java 代码讲解_Java泛型详解
2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...
- java 字符串 常量_Java进阶——Java中的字符串常量池
字符串常量池 JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内存,这段内存被成为字符串常量池(方法区中).实际上还有整型常量池.浮点型常量池等等.字符串常量池存放的是对象的引用,而不是对象 ...
- java泛型 初始化_Java泛型详解
概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有 ...
- java递归函数例子_Java递归函数详解附案例
递归函数在Java语言中得到了广泛的应用,它使得程序的编写过程更加的清晰明了.对Java初学者来讲,递归函数是需要学习的一个重要知识点.本文将附上案例和演示代码,具体为大家介绍递归函数的概念.要素以及 ...
- Java注解库_Java 注解详解
本文部分摘自 On Java 8 基本语法 注解是 Java 5 所引入的众多语言变化之一,是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影 ...
- java内部类选择题_java内部类详解(附相关面试题)
说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟. 一.内 ...
- java邮箱正则表达式_Java正则表达式详解
亲爱的小伙伴们,本期我们讲解java中的正则表达式和它相关的一些类与方法. 概述 正则表达式非常强大,能够解决我们开发时用于匹配一些特定的要求.并且java中还提供了相当强大的方法,扩展其功能性.下面 ...
- java正则表达式原理_Java 正则表达式详解
摘自:http://www.jb51.net/article/16829.htm 许多语言,包括 Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些 ...
- java生日正则表达式_Java正则表达式详解
如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单.如果你不熟悉这个术语,那么"正则表达式"(Regular Expres ...
最新文章
- 关于Java为什么配置好环境变量但是不能在命令行cmd运行javac的问题
- 曲线均匀分布_R——概率统计与模拟(三) 变换均匀分布对特定分布进行抽样
- Java与汽车_Java NIO:IO与NIO的区别
- php的yii简介,yii
- python实训目的意义_Python实训第二天--基础知识2
- MySQL Encryption and Compression Functions(加密)
- semaphore性能问题_SQL Server性能调整– RESOURCE_SEMAPHORE等待
- 【前端】【cornerstone】cornerstone.js如何编辑图像/加载已有图像数据(以画直线为例)
- 基于虚拟帐号的邮件系统extmail(1)
- STM32:GPIO配置说明
- 【Spring学习笔记-0】Spring开发所需要的核心jar包
- 并发编程学习之Callable接口
- 超详细的微信公众号创建与管理教程
- c语言中while循环语句的作用,while和do while循环,C语言while和do while循环详解
- 【Python】【C语言】P3353 在你窗外闪耀的星星
- msvcr120.dll丢失如何修复
- 金田一少年の怪奇事件部
- unity 在移动平台中,文件操作路径详解
- linux下SCP无密码传输(建立互信关系)
- cad指北针lisp_auto cad指北针图块下载|CAD指北针