Java容器深入浅出之String、StringBuffer、StringBuilder

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 对字符串的花式处理一直是现代应用系统的主要操作之一,也是对Java基础知识考察的重要方面。事实上,Java字符串类的底层是通过数组来实现的。具体来说,String类是固定长度的数组,StringBuffer和StringBuilder则是可变长度的,其底层是通过Arrays.copyOf的方法,复制了另外的一个数组,实现了一个内部扩容机制,从而实现一种“伪可变”。

对字符串的花式处理一直是现代应用系统的主要操作之一,也是对Java基础知识考察的重要方面。事实上,Java字符串类的底层是通过数组来实现的。具体来说,String类是固定长度的数组,StringBuffer和StringBuilder则是可变长度的,其底层是通过Arrays.copyOf的方法,复制了另外的一个数组,实现了一个内部扩容机制,从而实现一种“伪可变”。

Java字符串要点

1. String类是不可变类,一旦创建,包含在String对象中的字符数组是不可变的,直至该对象被回收。但是正如数组一样,可以更改对象的引用,指向另一个String对象。

2. StringBuffer在使用上呈现出一个可变的字符数组的对象,因此有增删查改的方法。该类通过synchronized同步方法实现线程安全。

3. StringBuilder的构造方法和API与StringBuffer类似,不过是线程不安全的,因此性能较高。

String类构造方法和方法说明

 1 package org.leo.demo.arrays;
 2 
 3 import java.io.UnsupportedEncodingException;
 4 //因为String类的不可变性,因此所有的连接、截取操作,都不改变原字符串的值。
 5 public class TestString {
 6 
 7     public static void main(String[] args) throws UnsupportedEncodingException {
 8         //字符串初始化
 9         String s1 = "Hello World!";
10         System.out.println(s1);
11         //通过byte[]和码表来构造字符串
12         byte[] b = {21, 97, 12, 100};
13         String s3 = new String(b, "utf-8");//有UnsupportedEncodingException异常抛出
14         System.out.println(s3);
15 
16         //返回字符串长度
17         String s2 = new String("aeiou");
18         System.out.println(s2.replace('a', '$'));
19         System.out.println("s2.length()" + s2.length());
20         //通过索引查找字符
21         System.out.println("s2.charAt(2):" + s2.charAt(2));
22         //查找索引
23         System.out.println("s2.indexOf('o')" + s2.indexOf('o'));
24         System.out.println("s2.indexOf(\"io\")" + s2.indexOf("io"));
25         //查找前缀/后缀
26         System.out.println("s2.endsWith(\"ih\")"+s2.endsWith("ih"));
27         System.out.println("s2.startsWith(\"ae\")" + s2.startsWith("ae"));
28         //字符串的比较
29         String s21 = new String("aeiouwww");
30         String s22 = new String("aewou");
31         System.out.println("s2.compareTo(s21):"+s2.compareTo(s21));
32         System.out.println("s2.compareTo(s22):"+s2.compareTo(s22));
33         StringBuffer sb1 = new StringBuffer("aeiousss");
34         System.out.println("s2.contentEquals(sb1):"+s2.contentEquals(sb1));
35         System.out.println("s2.equals(s22)"+s2.equals(s22));
36         //连接
37         System.out.println(s1.concat(s2));//相当于"+"
38         char[] c = new char[] {'a','e','i','h','h','j'};
39         String s4 = String.copyValueOf(c, 1, 3);
40         System.out.println(s4);
41         //数组化
42         byte[] b1 = s4.getBytes();
43         System.out.println(b1.toString());
44         s4.getChars(1, 2, c, 2);
45         System.out.println(c.toString());
46         System.out.println(s4.toCharArray());
47         
48         for(byte cc:b1) {
49             System.out.print(cc + " ");
50         }
51     }
52 
53 }

StringBuilder常用方法说明

 1 package org.leo.demo.string;
 2 
 3 public class TestStringBuilder {
 4 
 5     public static void main(String[] args) {
 6 
 7         StringBuilder sb = new StringBuilder();
 8         System.out.println(sb.hashCode());
 9         //增(追加)
10         sb.append("Java");
11         //增(插入)
12         sb.insert(0, "Hello ");
13         //
14         sb.replace(5, 6, ",");
15         //
16         sb.delete(5, 6);
17         System.out.println(sb);
18         //
19         char c = sb.charAt(5);
20         System.out.println(c);
21         //反转
22         sb.reverse();
23         System.out.println(sb);
24         //长度及容量
25         System.out.println("sb.length():" + sb.length());
26         System.out.println("sb.capacity():" + sb.capacity());
27         //取子串
28         String string = sb.substring(2, 6);
29         System.out.println(string);
30         //改变长度,将保留前n的StringBuilder对象
31         sb.setLength(4);
32         System.out.println(sb);
33         System.out.println(sb.hashCode());
34     }
35 
36 }
目录
相关文章
|
2月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
53 1
|
2天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
10 2
|
29天前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
13天前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
31 5
|
15天前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
30 4
|
1月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
15天前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
57 0
|
2月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
87 0
|
1月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
34 0
java基础(13)String类
|
6天前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
17 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性