当前位置: 首页 > article >正文

Java基础(4)——构建字符串(干货)

今天聊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流操作本质上就是数组


http://www.kler.cn/a/371802.html

相关文章:

  • 【水下生物数据集】 水下生物识别 深度学习 目标检测 机器视觉 yolo(含数据集)
  • [vulnhub]Kioptrix: Level 1.2 (#3)
  • 项目1 yolov5鱼苗检测计数
  • HTML5 应用程序缓存
  • 【Hadoop】hadoop的路径分不清?HDFS路径与本地文件系统路径的区别
  • ERC论文阅读(03)--SPCL论文阅读笔记(2024-10-29)
  • 结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统
  • 开源AI助力医疗革新:OCR系统与知识图谱构建
  • 大厂物联网(IoT)高频面试题及参考答案
  • HTML入门教程7:HTML样式
  • Go 读取xls文件 (shakinm/xlsReader/xls)
  • 消息队列-Rabbitmq(消息发送,消息接收)
  • 爬虫设计思路
  • ‘cmd‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
  • 【SQLite】改善默认输出格式不直观难以阅读问题:通过修改输出设置提升数据可读性
  • 【http作业】
  • Chrome异步编程
  • 深度学习数学基础之链式法则
  • 星巴克们需要找回节奏
  • 边缘计算【智能+安全检测】系列教程--agx orin解决RTC时间问题
  • python 轮子是什么
  • pytest脚本常用的执行命令
  • 【Gorm】传统sql的增删查改,通过go去操作sql
  • STM32 I2C通信:硬件I2C与软件模拟I2C的区别
  • 数据库OCP 19C要考哪两门
  • 【学习】ZLMediaKit试用