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不带有该关键字,所以不是线程安全
相关文章
|
13天前
|
安全 Java
Java基础之StringBuffer
【7月更文挑战第1天】 Java中的`StringBuffer`是线程安全的字符串操作类,适合多线程环境,而`StringBuilder`非线程安全,速度更快,适用于单线程。两者提供`append()`、`insert()`、`delete()`等方法修改字符串,避免了频繁创建新对象的性能问题。在不需要线程安全时,推荐使用`StringBuilder`以提高效率。
12 1
|
14天前
|
安全 Java 索引
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
|
18天前
|
存储 Java API
Java基础之String类
Java的String类是引用类型,用于创建和操作字符串。字符串对象在`java.lang`包中,不可变。创建方式包括字面量和`new`关键字。字符串池存储字符串常量,避免重复。比较字符串用`equals()`(区分大小写)和`equalsIgnoreCase()`(不区分大小写)。`length()`返回长度,`concat()`或`+`拼接,`substring()`截取,`indexOf()`和`lastIndexOf()`查找,`replace()`替换,`split()`分割。这些是常用的字符串API。
11 0
|
18天前
|
Java
Java基础之String类
Java基础之String类
15 0
|
21天前
|
存储 缓存 安全
java源码之String详解
java源码之String详解
15 0
|
4天前
|
Java 调度
Java线程的六种状态
Java线程有六种状态: 初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)、终止(TERMINATED)。
13 1
|
5天前
|
存储 安全 Java
Java面试题:请解释Java内存模型(JMM)是什么,它如何保证线程安全?
Java面试题:请解释Java内存模型(JMM)是什么,它如何保证线程安全?
37 13
|
1天前
|
安全 Java 开发者
Java并发编程中的线程安全性与性能优化
在Java编程中,处理并发问题是至关重要的。本文探讨了Java中线程安全性的概念及其在性能优化中的重要性。通过深入分析多线程环境下的共享资源访问问题,结合常见的并发控制手段和性能优化技巧,帮助开发者更好地理解和应对Java程序中的并发挑战。 【7月更文挑战第14天】
|
1天前
|
监控 Java API
Java并发编程之线程池深度解析
【7月更文挑战第14天】在Java并发编程领域,线程池是提升性能、管理资源的关键工具。本文将深入探讨线程池的核心概念、内部工作原理以及如何有效使用线程池来处理并发任务,旨在为读者提供一套完整的线程池使用和优化策略。
|
4天前
|
缓存 安全 Java
Java中线程池如何管理?
【7月更文挑战第11天】Java中线程池如何管理?
9 2