java基础小技巧回顾–浅析string-编程开发技术

java基础小技巧回顾–浅析string-编程开发技术

ID:30776675

大小:171.50 KB

页数:10页

时间:2019-01-03

java基础小技巧回顾–浅析string-编程开发技术_第1页
java基础小技巧回顾–浅析string-编程开发技术_第2页
java基础小技巧回顾–浅析string-编程开发技术_第3页
java基础小技巧回顾–浅析string-编程开发技术_第4页
java基础小技巧回顾–浅析string-编程开发技术_第5页
资源描述:

《java基础小技巧回顾–浅析string-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、hva基础小技巧回顾-浅析String-编程开发技术Java基础小技巧回顾-浅析String原文出处:xieyu_zy对于字符串部分,小胖在《Java特种兵》一书穿插了不少讲解,会讲得更加透彻一些,本文是小胖几年前写的,当初还在初窥门径阶段,很多结论的总结仅用于简单参考:木文非常简单,不过有很多朋友经常问,网上很多例了也写个大概,很多人也只是知道和大概,就本文而来读起来非常的轻松,不过算是一些小技巧;但是我们的程序中相信用得最多的就是char数组和byte[]数组,而String就是由chart]

2、数组组成的,一般情况下我们就可以认为String用得是最多的对彖么一。冇关Sring的空间利用率方而,这里不想多说,只能说很低很低,尤其是你定义的Stringli度很短的时候,简直利用率不好说;在前序的一篇文章中说明了关于java的对象空间申请方法以及对象在JVM内部如何做对其的过程,就能较为明确的知道一个String是多么的浪费空间;本文就不在多提及这方面的问题了。再谈及到String与StringBuffcr和StringBuildcr的区别时,而面一篇文章中将他们循环做了一系列的性能对比,发

3、现StringBuilder性能最高,大家都知道用StringBuilder来用了,但是要明口细节才是最好的;简单来讲String是不可变的字符串,而StringBuffer和StringBuilder是可变的字符串对象,而StringBuffer是在进行内容修改时(即char数组修改)会进行线程同步操作,在同步过程中存在征用加锁和访问对象的过程,开销较大,在方法内定义的局部变量屮没冇必要同步,因为就是当前线程使用,所以StringBuilder为一个非同步的可变字符串对彖。0K,我们介绍了基木的

4、概念,可以回到正题了;那么String到底是一个神马东西,通过前面的对象结构来看,首先根据String内部的定义,应该有以下内容:一个char数组指针指向一个数组对象(数组对象也是一个对象,和普通对象最大的区别需要一个位置来记录数组的长度)、offsetscount、hash、serialVersionUID(这个不用计算在对象的大小中,因为在JVM启动时就会被装入到方法区中)。其次,还有对象对其的过程,而String的内容为char数组引用,指向的数组对象的内部的内容,也就是一个String相当

5、于就包含了两个对象,两个对彖都有头部,以及对其方式,数组头部会多一个保存数组长度的区域,头部还会存储对象加锁状态、唯一标识、方法区指针、GC屮的Mark标志等等相应的内容,如果头部存储空间不够就会在外部开辟一个空间來存储,内部用一个指针指向那块空间;另外对象会按照8byte对其方法进行对其,即对象大小不是8byte的倍数,将会填充,方便寻址。String经常说是不可变的字符吊,但是我个人并不习惯将他说成是常量,而很多人也对String字符串不可变以及StringBuilder可变冇着很多疑惑Z处,

6、String可以做+,为什么说它不可变呢?String的+到底做了什么?冇人说String还有一些内容可能会放在常量池,这是什么东西?常量池和常量池的字符串拼接结果是什么(我曾在网上看到有人写常量池屮字符串和常量池屮字符串拼接结果还在常量池,其实未必,后面我们用事实來说话)?当你对上述问题了如指掌,String你基本了解得有点通透了;0K,在解释这个问题之前,我们先说明一个在Hotspot自从分代JVM产生后到目前为止(G1还没有止式出來Z前)不变的道理就是,当你在程序中只要使用了new关键字或者

7、通过任何反射机制实例化的任何对象都将首先放在堆当中,当然般情况下首先是放在Eden空间中(在一些细节的版本中会有一些区别,如启动了TABL、或对彖超过指定大小直接进入Old或对象连Eden也放不下也会直接进入Old);这是不用说的事实,总之目前我们只要知道它肯定是在堆当中的就可以了。我们先来看一段非常非常简单的代码如下所示:publicclassStringTest{publicstaticvoidm3in(String[]args){Stringa=〃abc〃;Stringb=〃def〃;Str

8、ingc二a+b;Stringd=〃eibc〃+"def";Stringe=newString(,zabc,z);System,out・println(a二二e);System.out.println(a・equals(c));System.out.println(a=="abc");System,out.printin(a==e.intern());System,out.printin(c二二"abedef");System,out・println(d二二"abedef");请在

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。