在进一步解读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篇(三) 存储篇的更多相关文章

  1. JDK源码学习--String篇(二) 关于String采用final修饰的思考

    JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JD ...

  2. JDK源码学习--String篇(-)

    工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...

  3. JDK源码学习--String篇(四) 终结篇

    StringBuilder和StringBuffer 前面讲到String是不可变的,如果需要可变的字符串将如何使用和操作呢?JAVA提供了连个操作可变字符串的类,StringBuilder和Stri ...

  4. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  5. JDK源码学习系列03----StringBuffer+StringBuilder

                         JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类A ...

  6. JDK源码学习系列01----String

                                                     JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道 ...

  7. JDK1.8源码学习-String

    JDK1.8源码学习-String 目录 一.String简介 String类是Java中最常用的类之一,所有字符串的字面量都是String类的实例,字符串是常量,在定义之后不能被改变. 二.定义 p ...

  8. JDK源码学习系列02----AbstractStringBuilder

     JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuil ...

  9. JDK源码学习笔记——LinkedHashMap

    HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ...

随机推荐

  1. #include <locale.h> #include <locale>

    C C++ C 1 setlocale setlocale,本函数用来配置地域的信息,设置当前程序使用的本地化信息. #include <stdio.h> #include <std ...

  2. C#下使用GDAL

    參考博客:http://blog.csdn.net/rrrrssss00/article/category/915498.以及viewmode=contents">李民录老师专栏.ht ...

  3. 动画原理——绘画API

    书籍名称:HTML5-Animation-with-JavaScript 书籍源码:https://github.com/lamberta/html5-animation 1.canvas的conte ...

  4. JqueryEasyUI中combox的数据不显示

    在做一个用jeasyui做的项目中遇到一个问题,对应的数据取出来了但是数据项一直出不来后来经过检查原来是赋值的时候对应的数组元素的名称写的有问题,以后一定要注意对应的问题,不能犯类似的错误 funct ...

  5. 简述Linq中.ToList(), .AsEnumerable(), AsQueryable()的区别和用法

    [TOC] 这3个方法的功能完全不同, 应按照具体业务场景使用. AsQueryable() 先说说什么是 IQueryable IQueryable 是当前的 data provider 返回的类型 ...

  6. CentOS7配置VNC Server

    CentOS7与6有些许变化,感觉有点不太适应. Step 1: 安装tigervnc server 和 X11 fonts: [root@mdrill ~]# yum install tigervn ...

  7. 勉強すべきURL

    http://www.atmarkit.co.jp/ait/articles/1403/19/news034_2.html http://webdesignerwork.jp/web/responsi ...

  8. codeforces 652E . Pursuit For Artifacts 强连通分量

    题目链接 题目大意: 给一个图, n个点m条边, 某些边上面有权值. 一条边只能走一次, 给两个点s, t. 问你, 从s到t能否经过有权值的边. 首先肯定要缩点, 然后看同一个连通分量里面的边, 是 ...

  9. myeclipse 环境配置优化,不断跟新整理中

    myeclipse 环境配置,不断跟新整理中1.General --->Workspace ---> UTF-8 工作环境编码2.General --->Editors --> ...

  10. delphi 线程池基础 TSimplePool

    1. TSimpleThread 2. TSimpleList 3. 以1,2构成 TSimplePool 用法 先定义: TDoSomeThingThread=class(TSimpleThread ...