String、StringBuffer、StringBuilder的区别

简介: String String不可变,StringBuffer、StringBuilder可变,还有什么区别?String:查源码,类的声明是:public final,清楚的知道,fianl是不可改变的。

String


String不可变,StringBuffer、StringBuilder可变,还有什么区别?

String:查源码,类的声明是:public final,清楚的知道,fianl是不可改变的。
但是操作字符串的时候,你感觉字符串变长了(改变?)原理是这样的:

String name1 = "Luoce";
String name2 = name1 + " Jack";

字符串变?错!
字符串对象的内容是无法更改的!

反编译这段程序,运行机制其实是:
String s = "Luoce";
String s1 = (new StringBuilder().append(s).append(" Jack").toString());
 一旦我们字符串的值改变,内存创建一个新的字符串对象,原来的对象就会变为垃圾被GC回收掉,
非常复杂操作来进行的String拼接


StringBuffer、StringBuilder的区别

所以,涉及到字符串操作的,我们一般使用StringBuffer或者StringBuilder,两者有什么区别
StringBuffer和StringBuilder都集成了AbstractStringBuilder,
而StringBuffer大部分方法都是synchronized,线程安全,
但是StringBuilder没有,线程不安全。

而且因为线程安全的提升,牺牲的运行速度。因为StringBuffer要维持同步锁,这肯定要消耗部分资源。

总结

    运行速度:StringBuilder >  StringBuffer  >  String
    Stirng:不可变
    StringBuffer线程不安全,StringBuffer线程安全

写个Demo测试速度差异

package demo;

/**
 * String、StringBuffer、StringBuilder速度测试比较
 * @author SYFC
 */
public class StringStringBufferStringBuilderTest {

    /**
     * string速度
     */
    public void stringTest(){
        long startTime = System.currentTimeMillis();
        String str = null;
        for (int i = 0; i < 20000; i++) {
            str = str + i +",";
        }
        System.out.println(System.currentTimeMillis()-startTime);
    }

    /**
     * StringBuffer速度
     */
    public void stringBuffer(){
        long startTime = System.currentTimeMillis();
        StringBuffer strBuffer = new StringBuffer();
        for (int i = 0; i < 20000; i++) {
            strBuffer.append(i+",");
        }
        System.out.println(System.currentTimeMillis()  - startTime);
    }

    /**
     * StringBuilder速度
     */
    public void stringBuilder(){
        long startTime = System.currentTimeMillis();
        StringBuilder strBuilder = new StringBuilder();
        for (int i = 0; i < 20000; i++) {
            strBuilder.append(i+",");
        }
        System.out.println(System.currentTimeMillis()-startTime);
    }

    /**
     * 测试
     */
    public static void main(String[] args) {
        StringStringBufferStringBuilderTest test = new StringStringBufferStringBuilderTest();

        test.stringTest();
        test.stringBuffer();
        test.stringBuilder();
    }
}

结果:
1033
5
3
相关文章
|
27天前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
44 1
|
2天前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
1月前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
20天前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
33 0
|
30天前
|
API 索引
String类下常用API
String类下常用API
32 1
|
30天前
for循环和String类下方法的一个练习题
for循环和String类下方法的一个练习题
42 1
|
6天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
11 1
Java——String类详解
|
2天前
|
Java 索引
Java String 类详解
Java 中的 `String` 类用于表示不可变的字符序列,是 Java 标准库 `java.lang` 包的一部分。字符串对象一旦创建,其内容不可更改,修改会生成新对象。
|
1月前
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?
|
1月前
|
存储 SQL Java
Java 系类之 Java StringBuffer类详解
这篇文章详细介绍了Java中的StringBuffer类的使用,包括其构造方法、追加字符串、替换字符、反转字符串和删除字符串的方法,并提供了相应的示例代码。