
【SE-04】String、StringBuilder、StringBuffer
发布日期:2021-05-07 08:58:13
浏览次数:19
分类:精选文章
本文共 2236 字,大约阅读时间需要 7 分钟。
String、StringBuffer与StringBuilder的技术深度解析
String的特性
String在Java中是不可变的字符序列,这一特性体现在以下几个方面:
不可变性:
当对字符串重新赋值时,需要重新指定内存区域,不能直接修改原有的对象。 例如,str = new String("test")
会创建一个新的字符串对象,而不是修改原有的字符串。 修改操作:
对字符串的任何修改操作(如拼接、replace()
等),都不会在原来的对象上直接修改,而是重新新建了一个修改后的对象。 例如,str.replace("o", "x")
会返回一个新的字符串,而不是修改原有的字符串。 内存管理:
String底层维护的是一个final
类型的字符数组,且其本身也为final
。 Java中是按值传递,只有对象引用按值传递,基本数据类型和字符串都是按值传递,无法通过方法修改对象指针。 String的定义方式
字符串在Java中可以通过以下几种方式定义:
使用new
操作符:
String str = new String(new char[]{'a', 'b', 'c'});
或者 String str = new String("abc");
这种方式适用于已知具体内容的情况。 字符串字面常量:
String str = "abc";
这种方式最常用,且在编译时会进行优化。 构造器:
String str = new String("abc", 2, 5);
这种方式适用于需要指定子字符串的情况。 字符串拼接:
String str = "a" + "b" + "c";
这种方式在多次拼接时会多次创建新的字符串对象,效率较低。 常见方法
String类中提供了一系列操作方法,主要包括以下几种:
length()
:返回字符串的长度。charAt(int index)
:返回指定索引位置的字符。substring(int beginIndex, int endIndex)
:返回子字符串。contains(String sequence)
:检查字符串是否包含指定子字符串。startsWith(String prefix)
:检查字符串是否以指定前缀开头。indexOf(String sequence)
:返回指定子字符串在当前字符串中的索引。需要注意的是,所有修改操作都会返回新的字符串对象,而不是修改原有的字符串对象。
StringBuffer与StringBuilder
StringBuffer
基本介绍:
StringBuffer是可变的字符序列,支持多线程操作,线程安全机制通过 synchronized 锁实现。底层实现:
StringBuffer底层创建了一个长度为(构造器内字符数+16)的字符数组。 例如:StringBuffer stringBuffer1 = new StringBuffer(); // 初始长度为16 StringBuffer stringBuffer2 = new StringBuffer("aaa"); // 初始长度为19
扩容机制:
当字符序列超出当前数组容量时,底层会扩容为原有容量的2倍+2,并将原有数组复制到新数组中。 例如:public void append(char c) { ensureCapacity(size() + 1); char[] value = array; value = new char[value.length * 2 + 2]; System.arraycopy(value, 0, array, 0, array.length); array = value; array[size++] = c; }
线程安全:
StringBuffer的所有操作都对锁进行了处理,确保线程安全。StringBuilder
基本介绍:
StringBuilder是不可线程安全的高效字符串操作类,JDK5.0新增。线程安全性:
StringBuilder的操作是不带锁的,因此在多线程环境中可能会出现数据不一致的问题。效率:
StringBuilder的操作效率比StringBuffer高,主要体现在不需要锁的开销。常用方法:
public StringBuilder append(char c) { super.append(c); return this; } public StringBuilder append(CharSequence seq) { super.append(seq); return this; }
三者比较
特性 | String | StringBuffer | StringBuilder |
---|---|---|---|
是否可变 | 不可变 | 可变 | 可变 |
是否线程安全 | 不安全 | 安全 | 不安全 |
内存分配方式 | 内部数组 | 内部数组 | 内部数组 |
性能 | 最差 | 较差 | 较好 |
常用场景 | 文本处理 | 大量修改 | 大量修改 |
总结
String、StringBuffer与StringBuilder三者各有优劣,选择时应根据具体需求决定。String适用于不可变的文本处理;StringBuilder适合需要高效操作的场景;而StringBuffer则是线程安全的选择。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月19日 05时04分03秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
3389连接痕迹清除
2019-03-06
发生系统错误 6118
2019-03-06
阿里巴巴Json工具-Fastjson教程
2019-03-06
Spring Cloud Gateway - 快速开始
2019-03-06
Spring Security 实战干货:理解AuthenticationManager
2019-03-06
Java对象转JSON时如何动态的增删改查属性
2019-03-06
Python 面向对象进阶
2019-03-06
Linux常用统计命令之wc
2019-03-06
Git安装及使用以及连接GitHub方法详解
2019-03-06
docker容器与虚拟机的区别
2019-03-06
shell脚本里使用echo输出颜色
2019-03-06
Python2跟Python3的区别
2019-03-06
并发编程——IO模型详解
2019-03-06
Java之封装,继承,多态
2019-03-06
wait()与notify()
2019-03-06
使用js打印时去除页眉页脚
2019-03-06
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
2019-03-06
ORA-00904: "FILED_TYPE": 标识符无效
2019-03-06
数据仓库系列之维度建模
2019-03-06
Scala教程之:函数式的Scala
2019-03-06