java中的String、StringBuffer和StringBuilder的详细分析

简介: 目录前言1. 源码1.1 String源码1.2 StringBuffer源码1.3 StringBuilder源码2. 总结前言java中用于处理字符串常用的主要三个类在开发中如何抉择以及在开发岗位中的高频面试题String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全)1. 源码主要的区别在于运行速度和线程安全1.1 String源码通过查看sting类的源码具体解释如下:String类表示字符串。 Java

前言

java中用于处理字符串常用的主要三个类
在开发中如何抉择以及在开发岗位中的高频面试题

  • String 字符串常量
  • StringBuffer 字符串变量(线程安全)
  • StringBuilder 字符串变量(非线程安全)

1. 源码

主要的区别在于运行速度和线程安全

1.1 String源码

通过查看sting类的源码
在这里插入图片描述
具体解释如下:

  • String类表示字符串。 Java程序中的所有字符串字面值,比如“abc”,都是作为这个类的实例实现的。
  • 字符串常量; 创建后不能更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,所以它们可以被共享。 例如: String str = "abc";

因此每次String 类型改变的时候等同于生成一个新的 String 对象,生成多一个对象,jvm的gc就会开始工作,速度就会变慢

1.2 StringBuffer源码

通过查看StringBuffer的源码
在这里插入图片描述
具体解释如下:

  • 线程安全的、可变的字符序列。 字符串缓冲区类似于string,但可以修改。 在任何时候,它都包含一些特定的字符序列,但是序列的长度和内容可以通过某些方法调用来改变。
  • 字符串缓冲区对于多个线程来说是安全的。 这些方法在必要的地方是同步的,这样,任何特定实例上的所有操作都表现得好像它们是按照某种顺序发生的,这种顺序与每个涉及的单个线程调用方法的顺序一致。
  • StringBuffer上的主要操作是追加和插入方法,它们是重载的,以便接受任何类型的数据。 它们可以有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。 append方法总是将这些字符添加到缓冲区的末尾; 插入方法将字符添加到指定的点。
  • 每当发生涉及到源序列的操作时(例如从源序列中追加或插入),该类只在执行操作的字符串缓冲区上同步,而不是在源上同步。 注意,虽然StringBuffer的设计是安全的从多个线程同时使用,如果构造函数或追加或插入操作是通过跨线程共享源序列时,调用代码必须确保操作有一个一致的和不变的视图的源序列操作的持续时间。 这可以通过调用者在操作调用期间持有锁来实现,方法是使用不可变的源序列,或者不在线程之间共享源序列。

1.3 StringBuilder源码

通过查看StringBuilder的源码
在这里插入图片描述
具体解释如下:

  • 变字符序列。 这个类提供了一个与StringBuffer兼容的API,但不保证同步。 该类设计用于在字符串缓冲区由单个线程使用的地方(通常情况下)作为StringBuffer的临时替代。 在可能的情况下,建议优先使用这个类,而不是StringBuffer,因为在大多数实现中它会更快。
  • StringBuilder上的主要操作是追加和插入方法,它们是重载的,以便接受任何类型的数据。 它们都能有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串构建器中。 append方法总是将这些字符添加到构建器的末尾; 插入方法将字符添加到指定的点。

2. 总结

  1. 运行速度快慢为:StringBuilder > StringBuffer > String
  2. 操作是多线程的,使用StringBuffer

操作是单线程的,速度比较快的StringBuilder

  1. 代码示例:
String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);

输出结果还是abcde,是因为原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,创建了新的对象赋值,所以速度会变慢

  1. StringBuffer 带有synchronized关键字,所以才是线程安全。而StringBuillder不带有该关键字,所以不是线程安全
相关文章
|
2月前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
64 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
2月前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
55 5
|
2月前
|
人工智能 自然语言处理 搜索推荐
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
233 5
|
2月前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
55 5
|
2月前
|
SQL Java API
|
2月前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
186 4
|
2月前
|
Java 数据库连接 数据库
【潜意识Java】使用 Ruoyi 框架开发企业级应用,从零开始的实践指南和分析问题
本文介绍了基于Spring Boot的开源企业级框架Ruoyi,涵盖环境搭建、项目初始化及用户管理模块的创建。
248 4
|
2月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
114 1
|
3月前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
70 6
|
4月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。

热门文章

最新文章