强哥说Java--Java String和StringBuilder(三)

简介: 强哥说Java--Java String和StringBuilder(三)

1. StringBuilder 概述



1.1 什么是 StringBuilder


与 String 相似,StringBuilder 也是一个与字符串相关的类


Java 官方文档给 StringBuilder 的定义是:可变的字符序列。


1.2 为什么需要 StringBuilder


在 Java 字符串的学习中,我们知道了字符串具有不可变性,当频繁操作字符串时候,会在常量池中产生很多无用的数据


而 StringBuilder 与 String 不同,它具有可变性。相较 String 类不会产生大量无用数据,性能上会大大提高。


因此对于需要频繁操作字符串的场景,建议使用 Stringbuilder 类来代替 String 类。


2. StringBuffer 概述



2.1 定义


了解了 StringBuilder 类 ,StringBuffer 也是不得不提的一个类,Java 官方文档给出的定义是:线程安全的可变字符序列。


2.2 与前者的区别


StringBuffer 是 StringBuilder 的前身,在早期的 Java 版本中应用非常广泛,它是 StringBuilder 的线程安全版本(线程我们将在后面的小节中介绍),但实现线程安全的代价是执行效率的下降。


你可以对比 StringBuilder 和 StringBuffer 的接口文档,它们的接口基本上完全一致。为了提升我们代码的执行效率,在如今的实际开发中 StringBuffer 并不常用。


3. StringBuilder 的常用方法



3.1 构造方法


StringBuilder 类提供了如下 4 个构造方法:


StringBuilder() 构造一个空字符串生成器,初始容量为 16 个字符;


StringBuilder(int catpacity) 构造一个空字符串生成器,初始容量由参数 capacity 指定;


StringBuilder(CharSequence seq) 构造一个字符串生成器,该生成器包含与指定的 CharSequence 相同的字符。;


StringBuilder(String str) 构造初始化为指定字符串内容的字符串生成器。


其中第 4 个构造方法最为常用,我们可以使用 StringBuilder 这样初始化一个内容为 hello 的字符串:


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         StringBuilder str = new StringBuilder("8/24");
     }
 }


3.2 成员方法


StringBuilder 类下面也提供了很多与 String 类相似的成员方法,以方便我们对字符串进行操作。下面我们将举例介绍一些常用的成员方法。


3.2.1 字符串连接


可以使用 StringBuilder 的 StringBuilder append(String str) 方法来实现字符串的连接操作。


我们知道,String 的连接操作是通过 + 操作符完成连接的:


String str1 = "Hello";
 String str2 = "World";
 String str3 = str1 + " " + str2;


如下是通过 StringBuilder 实现的字符串连接示例:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         StringBuilder str = new StringBuilder("8/24");
         str.append(" ");
         str.append("world");
         System.out.println(str);
     }
 }


运行结果:

8/24 world


由于 append() 方法返回的是一个 StringBuilder 类型,我们可以实现链式调用。例如,上述连续两个 append() 方法的调用语句,可以简化为一行语句:


//链式调用
 str.append(" ").append("world");
如果你使用 IDE 编写如上连接字符串的代码,可能会有下面这样的提示(IntelliJ idea 的代码截图):


提示内容说可以将 StringBuilder 类型可以替换为 String 类型,也就是说可以将上边地代码改为:


String str = "8/24" + " " + "world";


这样写并不会导致执行效率的下降,这是因为 Java 编译器在编译和运行期间会自动将字符串连接操作转换为 StringBuilder 操作或者数组复制,间接地优化了由于 String 的不可变性引发的性能问题。


值得注意的是,append() 的重载方法有很多,可以实现各种类型的连接操作。例如我们可以连接 char 类型以及 float 类型,实例如下:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         StringBuilder str = new StringBuilder("zs的身高是");
         str.append(':').append(172.5f);
         System.out.println(str);
     }
 }


运行结果:

zs的身高是:172.5


上面代码里连续的两个 append() 方法分别调用的是重载方法 StringBuilder append(char c) 和 StringBuilder append(float f)。


3.2.2 获取容量


可以使用 int capacity() 方法来获取当前容量,容量指定是可以存储的字符数(包含已写入字符),超过此数将进行自动分配。注意,容量与长度(length)不同,长度指的是已经写入字符的长度。


例如,构造方法 StringBuilder() 构造一个空字符串生成器,初始容量为 16 个字符。我们可以获取并打印它的容量,实例如下:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         // 调用StringBuilder的无参构造方法,生成一个str对象
         StringBuilder stringBuilder = new StringBuilder();
         System.out.println(stringBuilder.capacity());
         for (int i = 0; i < 17; i++) {
             stringBuilder.append(i);
         }
         System.out.println(stringBuilder.capacity());
     }
 }


运行结果:

16

34


3.2.3 字符串替换


可以使用 StringBuilder replace(int start, int end, String str) 方法,来用指定字符串替换从索引位置 start 开始到 end 索引位置结束(不包含 end)的子串。实例如下:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         // 调用StringBuilder的无参构造方法,生成一个str对象
         StringBuilder stringBuilder = new StringBuilder("Hello monkey");
         // 调用字符串替换方法,将 monkey 替换为 Jack
         stringBuilder.replace(6,12, "Jack");
         System.out.println(stringBuilder);
     }
 }


在IDEA里,是有提示的


运行结果:

Hello Jack


也可使用 StringBuilder delete(int start, int end) 方法,先来删除索引位置 start 开始到 end 索引位置(不包含 end)的子串,再使用 StringBuilder insert(int offset, String str) 方法,将字符串插入到序列的 offset 索引位置。同样可以实现字符串的替换,例如:


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         // 调用StringBuilder的无参构造方法,生成一个str对象
         StringBuilder stringBuilder = new StringBuilder("Hello monkey");
         stringBuilder.delete(6,12);
         //从第6位开始插入,内容是Jack
         stringBuilder.insert(6,"Jack");
         System.out.println(stringBuilder);
     }
 }


3.2.4 字符串截取


可以使用 StringBuilder substring(int start) 方法来进行字符串截取,例如,我们想截取字符串的第7到第9个字符,实例如下:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         // 调用StringBuilder的无参构造方法,生成一个str对象
         StringBuilder stringBuilder = new StringBuilder("Hello monkey");
         String str = stringBuilder.substring(7, 9);
         System.out.println(str);
     }
 }


运行结果:

on


3.2.5 字符串反转


可以使用 StringBuildr reverse() 方法,对字符串进行反转操作,例如:


实例演示


package com.caq.oop.demo08;
 public class Test {
     public static void main(String[] args) {
         // 调用StringBuilder的无参构造方法,生成一个str对象
         StringBuilder stringBuilder = new StringBuilder("Hello monkey");
         System.out.println(stringBuilder.reverse());
     }
 }


运行结果:

yeknom olleH


4. 小结



今天我们介绍了 Java 的 StringBuilder 类,它具有可变性,对于频繁操作字符串的场景,使用它来代替 String 类可以提高程序的执行效率;

相关文章
|
3月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
44 0
java基础(13)String类
|
12天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
18天前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
2月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
123 65
|
29天前
|
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'.
41 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
12天前
|
存储 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
|
1月前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
2月前
|
存储 SQL 安全
Java零基础-StringBuilder类详解
【10月更文挑战第12天】Java零基础教学篇,手把手实践教学!
33 5
|
2月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
57 1
下一篇
DataWorks