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