成功备案的网站增加域名,动感网站模板,东营网站建设预算价格,wordpress ping地址今天聊Java构建字符串以及其内存原理
我们先来看一个小例子。一个是String,一个是StringBuilder. 通过结果对比#xff0c;StringBuilder要远远快于String.
String/StringBuilder/StringBuffer这三个构建字符串有什么区别#xff1f;
拼接速度上#xff0c;StringBuilder…今天聊Java构建字符串以及其内存原理
我们先来看一个小例子。一个是String,一个是StringBuilder. 通过结果对比StringBuilder要远远快于String.
String/StringBuilder/StringBuffer这三个构建字符串有什么区别
拼接速度上StringBuilder/StringBuffer的速度要远远快于String。但StringBuilder多线程并发操作不安全StringBuffer多线程并发操作下安全StringBuffer里面加了锁速度稍微慢一点点。
原理 在内存中每个存储单元大小为1字节。如果想要获取10000B大小的数据要向内存申请一万次才能得到全部数据单元所以操作系统为了提高效率把内存按内存页划分每页4096个字节4KB。这样每次申请后读取一个内存页。10000B大约是3个内存页。 一个内存页只有一个总地址开头在一个内存页中只能储存一个变量其他的是找不到的。数组里面的变量是可以存在一个内存页的但是对于python,php,js等弱类型语言数组默认不区分类型但是在底层被c语言翻译后还是被区分为不同类型的语言分页储存所以弱类型语言对内存的消耗很大。 每个内存页设计为4KB大小这是一个折中的策略。既保证了一定的读取速度也不至于过大导致太多的浪费。所以操作系统一次分配的最小内存单元为4KB.。
回到我们刚才的小例子 String类型一旦创建原地址处不可变只能不断开辟新的内存页前4096次每次申请一个内存页后4097~8192一次申请两个内存页……以此类推。所以对内存的消耗是十分巨大的 。
如果是本地可变的话就会极大的降低内存的损耗。StringBuilder就是这样它默认有16字节的缓冲区存储空间当然这个空间的大小也可以自己设置。StringBuilder的前身就是StringBuffer。一般缓冲区buffer底层都是这种数组结构速度都很快。哪些操作需要到缓冲区呢 文件流操作网络流操作其实stream流操作本质上就是数组