【Java】Java中String、StringBuilder、StringJoiner详解

目录

引言

一、String

1.1 String的定义

1.1.1 直接赋值

1.1.2 new关键字创建 

1.2 常用方法

1.3 字符串的不可变性

1.4 字符串内存的存储原理

二、StringBuilder

2.1 常用方法

2.2 动态扩容策略

2.3 使用场景

三、StringJoiner

3.1 构造方法

3.2 常用方法

3.3 示例

总结


引言

在Java中,字符串处理是一项常见的任务,而String、StringBuilder和StringJoiner是处理字符串时常用的三个类。它们各自有不同的特点和用途,下面将详细解析这三个类,并附带代码示例。


一、String

String是Java中的一个类,代表不可变的字符序列。它是Java中最常用的类之一,用于表示文本信息。由于String的不可变性,一旦创建,其内容就不能被改变。任何对字符串的修改操作都会生成一个新的字符串对象。


1.1 String的定义


1.1.1 直接赋值

直接赋值:通过双引号直接赋值给String变量,这种方式创建的字符串会被存储在字符串常量池中,以节省内存。

String s1 = "hello";  
String s2 = "hello"; // s2会复用s1在字符串常量池中的对象

1.1.2 new关键字创建 

通过new关键字:使用new关键字创建String对象,这种方式创建的字符串对象不会被存储在字符串常量池中。 

String s3 = new String("hello");

1.2 常用方法

  • charAt(int index):返回指定索引处的字符。

String str = "hello";  
char c = str.charAt(1); // c = 'e'
  • indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。

int index = str.indexOf("e"); // index = 1
  • substring(int beginIndex, int endIndex):返回字符串的一个子字符串,从beginIndex(包含)到endIndex(不包含)。

String sub = str.substring(1, 4); // sub = "ell"
  • equals(Object anObject):比较两个字符串的内容是否相等。

boolean isEqual = s1.equals(s3); // true
  • toLowerCase() 和 toUpperCase():将字符串转换为小写或大写。

String lower = str.toLowerCase(); // lower = "hello"  
String upper = str.toUpperCase(); // upper = "HELLO"

1.3 字符串的不可变性

由于String的不可变性,任何对字符串的修改操作(如拼接、替换等)都会生成一个新的字符串对象。这可能会导致大量的内存分配和垃圾回收,特别是在处理大量字符串操作时。


1.4 字符串内存的存储原理

①直接赋值其字符串存在字符串常量池中,创建时会先在字符串常量池寻找有无相同的字符串,有则复用,无则创建;

②new关键字创建字符串,不会复用,而是都开辟出一个新空间。

注:键盘录入得到的字符串最终是new出来的。


二、StringBuilder

StringBuilder是Java 5中引入的一个类,用于创建和操作可变字符串。与String不同,StringBuilder允许在不生成新对象的情况下修改字符串的内容,从而提高了处理字符串时的效率和性能。


2.1 常用方法

append(String str):将指定的字符串追加到此字符序列。

StringBuilder sb = new StringBuilder("Hello");  
sb.append(" World"); // sb = "Hello World"

insert(int offset, String str):将指定的字符串插入此字符序列中的指定位置。

sb.insert(6, "Java "); // sb = "Hello Java World"

delete(int start, int end):移除此序列的子字符串中的字符。

sb.delete(5, 11); // sb = "Hello World"

reverse():将此字符序列用其反转形式取代。

sb.reverse(); // sb = "dlroW olleH"

toString():返回此序列中数据的字符串表示形式。

String result = sb.toString(); // result = "Hello World"

2.2 动态扩容策略

StringBuilder通过内部的字符数组来存储字符串数据。当现有容量不足以容纳更多的字符时,它会自动扩容。这种动态扩容的策略可以减少内存的重新分配次数和复制次数,从而提高性能。

拓展底层原理:

①默认创建一个长度为16的字节数组。

②添加的内容小于16,直接存。

③添加的内容大于16会扩容(原容量*2+2)。

④如果默认扩容还不够,则以实际长度为准。


2.3 使用场景

①字符串拼接。

②字符串反转。


三、StringJoiner

StringJoiner是Java 8新增的一个类,基于StringBuilder实现,用于实现对字符串之间通过分隔符拼接的场景。它简化了字符串拼接的复杂性,特别是在需要添加前缀、后缀和分隔符时。


3.1 构造方法

StringJoiner(CharSequence delimiter):创建一个不带前缀和后缀的StringJoiner,使用指定的分隔符。

StringJoiner sj = new StringJoiner(",");

StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix):创建一个带有指定前缀、后缀和分隔符的StringJoiner。

StringJoiner sj = new StringJoiner(",", "[", "]");

3.2 常用方法

add(CharSequence newElement):添加新的元素到StringJoiner中。

注:目前添加的内容只能是字符串

sj.add("hello");  
sj.add("world");

toString():返回拼接后的字符串。

String result = sj.toString(); // result = "[hello,world]"

3.3 示例

StringJoiner sj = new StringJoiner(",", "[", "]");  
sj.add("hello");  
sj.add("world");  
System.out.println(sj.toString()); // 输出: [hello,world]

总结

  • String:不可变的字符序列,适用于不需要修改字符串内容的场景。
  • StringBuilder:可变的字符序列,适用于需要频繁修改字符串内容的场景,如拼接、删除等操作。
  • StringJoiner:基于StringBuilder实现,简化了字符串拼接的复杂性,特别适用于需要添加前缀、后缀和分隔符的场景。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值