JDK源码学习--String篇(三) 存储篇
在进一步解读String类时,先了解下内存分配和数据存储的。
数据存储
1.寄存器:最快的存储区,位于处理器的内部。由于寄存器的数量有限,所以寄存器是按需分配。
2.堆栈:位于RAM中,但是通过堆栈指针可以从处理器哪里获得直接支持。堆栈指针向下移动,则分配新的内存;堆栈指针向上移动释放内存。
注:堆栈中存储基本的数据类型和【对象引用】,但是Java对象存储在堆中。
3.堆:通用内存池,位于RAM中,用于存放所有的Java对象。
注:堆中存储的 new创建的对象和数组。
4.常量存储:存放常量。
5.非RAM存储:数据不依赖于程序而存在。如:流对象和持久化对象
实例验证
String a = "test"; String b = "test";
其中"test"存储在String pool常量池中,String类的对象引用变量a和b存储在堆栈中。由于常量池中常量具有唯一性,所以引用对象a和b指向常量池中同一个常量"test"。
由此可知,上述代码的处理过程:
首先会在堆栈中创建一个String类的对象引用变量a,然后检查字符串常量池中是否含有"test",若没有则将"test"存放到字符串常量池中,同时将变量a指向"test";
当创建变量b的时候,做同样的处理操作,这是就不会重新在字符串常量池中增加"test",而是直接将变量b指向"test"。
综上得知:
第一行代码中:String a = "test";将产生一个对象和一个引用。
第二行代码中:String b = "test";则只会产生一个引用。
接着上面的示例
String c = new String("test"); String d = new String("test");
首先看String c = new String("test"); 这一段代码:
第一步:在堆栈中创建String类的对象引用变量c。
第二步:使用new创建对象,将在堆中创建新的String对象,同时检查字符串常量池中是否含有"test",没有就创建
第三步:将变量c指向堆中的对象
由于new操作,每次都会产生新的对象,所以String d = new String("test");执行的操作步骤和上面的执行步骤一致。
由上面两个例子可知:
System.out.println("a = b ?" + (a == b)); System.out.println("c = d ?" + (c == d));
输出结果:
a = b ? true c = d ? false
String最后一篇,将来讲述字符串的拼接,以及String,StringBuilder,StringBuffer的区别。
JDK源码学习--String篇(三) 存储篇的更多相关文章
- JDK源码学习--String篇(二) 关于String采用final修饰的思考
JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JD ...
- JDK源码学习--String篇(-)
工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...
- JDK源码学习--String篇(四) 终结篇
StringBuilder和StringBuffer 前面讲到String是不可变的,如果需要可变的字符串将如何使用和操作呢?JAVA提供了连个操作可变字符串的类,StringBuilder和Stri ...
- JDK源码学习笔记——Integer
一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...
- JDK源码学习系列03----StringBuffer+StringBuilder
JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类A ...
- JDK源码学习系列01----String
JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道 ...
- JDK1.8源码学习-String
JDK1.8源码学习-String 目录 一.String简介 String类是Java中最常用的类之一,所有字符串的字面量都是String类的实例,字符串是常量,在定义之后不能被改变. 二.定义 p ...
- JDK源码学习系列02----AbstractStringBuilder
JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuil ...
- JDK源码学习笔记——LinkedHashMap
HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ...
随机推荐
- Mysql----浅入浅出之视图、存储过程、触发器
一.视图 VIEW 视图是虚拟的表,本身不存储不论什么数据.仅仅有执行时,才包括动态检索出来的数据. eg:SELECT sid, name, sex, s_num FROM student, sc ...
- hdu 3068 最长回文(manachar求最长回文子串)
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...
- UVA 10163 Storage Keepers(dp + 背包)
Problem C.Storage Keepers Background Randy Company has N (1<=N<=100) storages. Company wants ...
- 学习DTD和Schema的几个例子
可以使用DTD(文档类型定义)来规定xml文档构建模块,可用起对xml文件进行验证.具体用法转:http://www.w3school.com.cn/dtd/dtd_intro.asp.同样也可以用S ...
- SQL Server数据库---》基础
SQL Server:只是操作数据库的一个工具(这种工具,只是提供一个界面化的方式让用户方便操作数据库) 开启服务:点击:我的电脑(计算机)--管理--服务和应用程序--服务--开启SQL Serve ...
- 对List对象按照某个成员变量进行排序
/** * 对List对象按照某个成员变量进行排序 * @param list List对象 * @param sortField 排序的属性名称 * @param sortMode 排序方式:ASC ...
- Linux计划任务(转载)
Linux计划任务(转载) Linux的计划任务是系统管理方面的一个重要内容,是系统自动完成工作的一种实现方式,正因为有了计划任务,我们才可以完全实现系统管理的脚本化和自动化. 关于计划任务,Linu ...
- 微博发布效果jq版
大家都看过新浪微博的发状态功能,我模拟了一下类似的效果,包括发布时间,删除效果等.代码如下: <!DOCTYPE HTML> <html> <head> <m ...
- 页面类跳转Demo
package baidumapsdk.demo; import android.app.Activity; import android.content.BroadcastReceiver; imp ...
- sass教程
sass教程 1. 使用变量; sass让人们受益的一个重要特性就是它为css引入了变量.你可以把反复使用的css属性值 定义成变量,然后通过变量名来引用它们,而无需重复书写这一属性值.或者,对于仅使 ...