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

看了半天,原来
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的实现中可以看出,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语句,你看看结果是什么?

网友评论