美文网首页
Java开发中字符串的性能千万别轻视

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

作者: 奔向金字塔 | 来源:发表于2020-01-16 16:22 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Java开发中字符串的性能千万别轻视

          本文链接:https://www.haomeiwen.com/subject/bimfzctx.html