我们首先要知道,在操作系统是上内存是以页为单位分配的。
java中的字符串不能在原地址修改,每次都需要申请新空间,11个字符串共需要申请11个空间 (操作系统要以4kb为单元分配)。实际上消耗11个页单元,44kb。
字符串每次申请空间是用多少申请多少,字符串每拼接一次都要重新申请一个存储单元
字符串拼接会对内存造成极大消耗。而
StringBuilder 一上来就申请足够的空间,而且它的内容可以修改。
比如:char[] arr=new char[4096];
上来申请两个页空间,原char数组是比较大的,所以拼接的时候在页空间加就完事了。
满了之后呢,在其他地方在申请大空间。
因为字符串拼接不可变 每次改变值都需要申请空间,而这个StringBuilder申请的空间,只有满了才要需要申请新空间。它支持原地址修改值,字符串不支持,拼接次数越多二者消耗内存空间差距越大。
有兴趣的可以自行测试一下