在进一步解读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. Binary String Matching(kmp+str)

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Given two strings A and B, whose alp ...

  2. HTTP状态码(HTTP Status Code)【转】

    HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应 ...

  3. 错误:C:\Windows\System32\ssleay32.dll: Can't load IA 32-bit .dll on a AMD 64-bit

    错误:C:\Windows\System32\ssleay32.dll: Can't load IA 32-bit .dll on a AMD 64-bit 错误的原因是:jdk不是64位的,而是32 ...

  4. 传iWatch 将在7月投入生产,10月出货,支持无线充电、触控、測量脉搏

    今天又有关于 iWatch 的传言传出.据路透社的线人消息称,台湾的广达电脑(Quanta Computer Inc.)将于 7 月開始生产 iWatch.10 月出货,估计推出后首年的出货量为 50 ...

  5. 使用win8时删除自带的输入法的好方法

    无直接把那个语言都删了,再直接装输入法就行了.

  6. 查询SQL中某表里有多少列包含某字段

    select c.name from SYSCOLUMNS as c left join SYSOBJECTS as t on c.id=t.id where c.name like '这里是某个字段 ...

  7. self

    self在对象方法中使用,指代调用当前对象方法的对象.可以利用self->属性名称的方法访问成员变量 self在类方法中使用,其指代的是当前类. 使用总结: self 谁调用当前方法,self就 ...

  8. js清空页面控件值

    function funClear() {var txts = document.getElementsByTagName("input");for (var i = 0; i & ...

  9. 后台程序控制js弹出框

    public void jsWindow(String msg, int i){ HttpServletResponse response=ServletActionContext.getRespon ...

  10. EJB QI查询

    EO.PNAME like ?1 OR  EO.PNAME like ?2";      Query query = entityManager.createNativeQuery(quer ...