Java的字符类String、StringBuffer与StringBuilder异同对比分析

简介: Java的字符类String、StringBuffer与StringBuilder异同对比分析Java String是一个“不可变常量字符串”对象,final属性定义。
Java的字符类String、StringBuffer与StringBuilder异同对比分析


Java String是一个“不可变常量字符串”对象,final属性定义。之所以这么说,是从String内部在盛放字符串时候的容器char数组而言。比如当用户在初始化阶段定义了一个String对象String s=”hello,world!”,而此时再次对s进行操作改变s的值时候,如再次给s赋值使得s=”zhangphil”,那么Java的JVM其实是再次创建了一个新的String对象,然后移动指针s指向了新的String对象(对象内部的字符串是“zhangphil”)。由此可见,假如在代码中需要频繁的修改String对象中的字符内容,那么应该尽量避免使用String,原因在于每一次修改String内容后,其实就是JVM在内存堆上创建了一个新的String对象,由此导致的问题有三:
(一)如果代码中的String对象频繁的修改,表面仍然是在一个String对象中修改赋值,但其实底层的JavaJVM在内存的堆上创建了更多新的String对象,同时与之相伴随的是更多死去的String对象,此过程简单总结就是Java JVM在频繁的创建对象,也产生死去的对象,即,生成一个新的String对象,死去一个String对象。这样将产生大量JVM内存碎片,极大概率提高Java了系统触发Java GC的时机,由此降低了系统性能 。
(二)String对象的产生、赋值修改操作过程是多线程不安全操作,原因如前所述,每一次对String对象的赋值、操作,导致Java JVM在底层创建了新的String对象,在操作系统的CPU时机片上,线程不保证安全。如果多线程在操作此String对象,那么就极有可能在操作系统调度切换CPU时间片时,操作的目标对象不一致,有的指向新的String s对象,有的线程却仍指向旧的String s对象。
(三)每一次修改赋值String s对象,是创建了新的String对象,然后把新的对象引用赋给s。这个操作是在堆上创建 ,若频繁操作,势必造成较大系统开销。
小结:如果是在代码启动后,String对象不再修改重新赋值,那么可以考虑使用String,比如在代码中定义一些public static final String常量。如果需要在代码中频繁修改和赋值操作字符串对象具体内容,建议使用StringBuffer。
不同于String字符串常量,StringBuffer是字符串变量。StringBuffer不会产生String那样的问题:每一次修改就重新创建一个新的String对象。在某种程度上讲,StringBuffer内部维持一个可变长度的char数组盛放用户字符数据,因此StringBuffer是线程安全的。由于StringBuffer是在一个字符char数组进行原子赋值、操作,不是像String那样以“乾坤大挪移”的方式改变引用进行字符串赋值、操作,在理论上讲,字符的操作层面,StringBuffer的性能优于String。
StringBuilder是在后续新版Java中引入的字符类,StringBuilder和StringBuffer类似,均是字符串变量,但是StringBuilder多线程不安全,而单线程安全,StringBuilder在单线程中性能优于StringBuffer,所,如果仅仅是在单线程中使用字符串变量,优先可考虑使用StringBuilder。
相关文章
|
19天前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
91 60
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
173 57
|
28天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
76 8
|
8月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类
51 0
|
8月前
|
存储 XML 缓存
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
83 0
|
5月前
|
安全 Java
【Java基础面试二十七】、说一说StringBuffer和StringBuilder有什么区别
这篇文章介绍了Java中StringBuffer和StringBuilder的区别:StringBuffer是线程安全的,而StringBuilder是非线程安全的,因此在单线程环境下优先推荐使用StringBuilder以获得更好的性能。
|
5月前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
5月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
317 0
|
8月前
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究