String、StringBuffer、StringBuilder区别
1)String、StringBuffer、StringBuilder区别
-
String:String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间
-
StringBuffer:是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量
-
StringBuilder:可变类,速度更快、线程不安全(不能同步访问)
字符串常量池在方法区中(本文是jdk1.7前编辑的,jdk1.7之后字符串常量池移至堆中)
使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中;只要s1是变量,不论s1指向池中的字符串对象还是堆中的字符串对象,运行期s1 + “aa”操作实际上是编译器创建了StringBuilder对象进行了append操作后通过toString()返回了一个字符串对象存在heap上。
对字符串进行修改的时候,特别是字符串对象经常改变的情况下,需要使用 StringBuffer 和 StringBuilder 类
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类
参考链接:https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303
2)String是用final修饰的,不可继承
通过阅读源码可以知道,String都是通过字符数组实现的。
其中string的字符数组是final修饰的,所以字符数组不可以修改。
上面第二句话的意思是:String类的所指向的字符数组不可修改,但是这个String的指向可以修改
3)为什么StringBuffer是final类型但值可以改变?String却不能改变?
-
final修饰的成员变量为基本数据类型时,赋值后无法改变。String中用一个final 的char数组private final char value[]
-
当final修饰的为引用变量时,在赋值后其指向地址无法改变,但对象内容可以改变
-
String中用一个final 的char数组private final char value[];而StringBuffer对象的底层也是一个char[]数组,但是并没有用final修饰,所以数组的值是可变的。
4)String对象内存分配(常量池和堆):
https://www.bilibili.com/read/cv10202424/
https://baijiahao.baidu.com/s?id=1694462729201489422&wfr=spider&for=pc
https://blog.csdn.net/weixin_46286156/article/details/121905988
https://blog.csdn.net/weixin_45970271/article/details/124675457
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现