前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA常见问题--字符串

JAVA常见问题--字符串

作者头像
艳龙
发布2021-12-16 18:00:31
2360
发布2021-12-16 18:00:31
举报
文章被收录于专栏:yanlongli_艳龙yanlongli_艳龙

字符串是常用的数据类型。在 Java 中,常见的字符串类型包括 StringStringBufferStringBuilder

String

从 String 的源码可以看到,String 使用数组存储字符串的内容,数组使用关键词 final 修饰,因此数组内容不可变,使用 String 定义的字符串的值也是不可变的。

由于 String 类型的值不可变,因此每次对 String 的修改操作都会创建新的 String 对象,导致效率低下且占用大量内存空间。

tips: string 数据是存储在常量池中的,不在堆中 也 不在栈中。

StringBuffer 和 StringBuilder

StringBuffer 和 StringBuilder 都是 AbstractStringBuilder 的子类,同样使用数组存储字符串的内容,由于数组没有使用关键词 final 修饰,因此数组内容可变,StringBuffer 和 StringBuilder 都是可变类型,可以对字符串的内容进行修改,且不会因为修改而创建新的对象。

在需要经常对字符串的内容进行修改的情况下,应使用 StringBuffer 或 StringBuilder,在时间和空间方面都显著优于 String。

StringBuffer 和 StringBuilder 有哪些区别呢?从源码可以看到,StringBuffer 对定义的方法或者调用的方法使用了关键词 synchronized 修饰,而 StringBuilder 的方法没有使用关键词 synchronized 修饰。由于 StringBuffer 对方法加了同步锁,因此其效率略低于 StringBuilder,但是在多线程的环境下,StringBuilder 不能保证线程安全,因此 StringBuffer 是更优的选择。

总结

String 是不可变类型,每次对 String 的修改操作都会创建新的 String 对象,导致效率低下且占用大量内存空间,因此 String 适用于字符串常量的情形,不适合需要对字符串进行大量修改的情形。 StringBuffer 是可变类型,可以修改字符串的内容且不会创建新的对象,且 StringBuffer 是线程安全的,适用于多线程环境。 StringBuilder 是可变类型,与 StringBuffer 相似,在单线程环境下 StringBuilder 的效率略高于 StringBuffer,但是在多线程环境下 StringBuilder 不保证线程安全,因此 StringBuilder 不适合多线程环境。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021/6/9 下午,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • String
  • StringBuffer 和 StringBuilder
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档