Java开发中字符串的性能千万别轻视

1.String字符串使用多,底层实现到底是啥样?

(1)平时我们开发用到最多的就是字符串,好多变量都需要定义。那么字符串底层结构是啥样,咋实现的,我们先贴个图。先看看图,然后在想想,品一品。


String实现结构.png

看了半天,原来

java6的时候,是有char[]数组,hash,offset,count组成的;
java7/8的时候,offset和count被去掉了,只剩一个char[]数组和hsah;
java9的时候,居然不是char[]数组了,变成了byte[]数组和hash。另外特有的加了一个coder。

为啥变成了byte[]数组。我们知道char占位2字节16为。byte占位1字节8位。我们的系统中,好多单字节变量,其实用一个字节就可以。没必要用2个字节。所有这里可能为了节省内存空间,使用了byte[]一字节。

2.开发很久,注意到String对象还有个不可变性?

String实现.png

从以上String的实现中可以看出,char[]数组是final+Private修饰的。说明String对象是不能修改的,String对象一旦创建,就不能进行改变。

2.1.不可变性有啥好处?

(1)String对象安全了,不会被随意修改。
(2)既然不可变,那么hash也就不会一直频繁的变了。
(3)有时候可以避免对象重复创建在内存中,比如String str = "aaa",String Str2 = "aaa";其实就是一个对象的引用。不用多在内存中创建对象。

3.最后谈谈,既然以上都了解了基本,那么如何去优化呢?

3.1构建很大的字符串的时候,如何操作更优秀

(1)在开发中,我们应该使用Stringbuffer和Stringbuilder来拼接;
(2)类似String str = "aa".append("bb").appned("cc");
初始化的时候编译器自动优化这个拼接,自动拼接成aabbcc,然后初始化到常量池并且创建str对象;
这样子是在内存中是一个对象的引用。不会创建多个对象。也就是不会创建 aa,aabb,aabbcc,这样的步骤。

4.小思考,如下创建字符串的java语句,你看看结果是什么?

创建字符串.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Tip:笔者马上毕业了,准备开始 Java 的进阶学习计划。于是打算先从 String 类的源码分析入手,作为后面...
    石先阅读 12,065评论 16 58
  • 这里来对Java中的String对象做一个稍微深入的了解。 Java对象实现的演进 String对象是Java中使...
    也许会了阅读 1,222评论 0 9
  • 五、IO流 1、IO流概述 (1)用来处理设备(硬盘,控制台,内存)间的数据。(2)java中对数据的操作都是通过...
    佘大将军阅读 538评论 0 0
  • 折戟-【MP3_声音_录音】免费在线收听 《折戟》原创 斜阳入前楹尽付误流年 半轩飞絮吹远 西城清风满饮马孤烟浅 ...
    糖紫芯阅读 542评论 0 2
  • 今天Sir来打脸了。 郑重地。 在上个月底写新片前瞻的时候,Sir给一部电影的期待值打了一星。 凭什么? 看导演,...
    Sir电影阅读 2,253评论 4 50