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天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
19天前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
1月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
48 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
13天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
28天前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
54 7
|
7月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类
50 0
|
4月前
|
安全 Java
【Java基础面试二十七】、说一说StringBuffer和StringBuilder有什么区别
这篇文章介绍了Java中StringBuffer和StringBuilder的区别:StringBuffer是线程安全的,而StringBuilder是非线程安全的,因此在单线程环境下优先推荐使用StringBuilder以获得更好的性能。
|
4月前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
4月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
209 0
|
7月前
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究