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

冷眼看人间恩怨 2024-10-23 15:05:01 阅读 85

目录

引言

一、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变量,这种方式创建的字符串会被存储在字符串常量池中,以节省内存。

<code>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实现,简化了字符串拼接的复杂性,特别适用于需要添加前缀、后缀和分隔符的场景。

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。