在进一步解读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. error: C2664: “zajiao::zajiao(const zajiao &)”: 无法将参数 1 从“const char [12]”转换为“char *”

    原本打算在QT用一个字符串"ABCDEF12345"作为类zajiao的构造函数的参数,用来创建类zajiao的对象zajiao1. zajiao zajiao1("AB ...

  2. docker制作node程序镜像:

    准备: 需要5个文件 新建一个docker文件夹 1 .ignore git忽略文件用的 2 pakage.json 安装NODE程序的 也可以直接拷贝进 docker文件加 3 node环境 lin ...

  3. 重写系统中的UINavigationController返回按钮的事件

    1.扩展UIviewController UIViewController+BackButtonHandler.h #import <UIKit/UIKit.h> @protocol Ba ...

  4. iSCSI存储系统知识

    一.概述 SCSI 即小型计算机系统接口(Small Computer System Interface:简写:SCSI),一种用于计算机和外部设备之间(硬盘.光驱.软驱.打印机等)系统级接口的独立处 ...

  5. 如何生成log新信息背景图片和在图片上添加水印

    在图片上添加文字水印,其实就是要用到两个类, using System.Drawing;             using System.Drawing.Drawing2D; 废话不多说了,直接上代 ...

  6. bootstrap注意事项(六)按钮

    1.预定义样式 使用下面列出的类可以快速创建一个带有预定义样式的按钮 <!DOCTYPE HTML><html><head> <link rel=" ...

  7. sql server存储过程分页

    Create PROCEDURE [dbo].[Table_GetList] ) = '', -- 查询条件(注意: 不要加 WHERE) ) = '', -- 设置排序 , -- 页尺寸 , -- ...

  8. nginx fastcgi buffers影响页面输出数据大小记录

    一台测试服务器由于没做fastcgi_buffer单独设置,在跑一个显示10w条数据的循环输出时只能显示4700-5200条记录 <?php $str = ''; for($i = 0; $i ...

  9. 【转】sun.misc.BASE64Encoder找不到jar包的解决方法

    只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了.(太神奇了,转自http://blog. ...

  10. How to Send an Email Using UTL_SMTP with Authenticated Mail Server. (文档 ID 885522.1)

    APPLIES TO: PL/SQL - Version 9.2.0.1 to 12.1.0.1 [Release 9.2 to 12.1]Information in this document a ...