public static void main(String[] args) {
String name = "张三";
name = "李四";
System.out.println(name);// 李四
}
name
变量是一个引用变量,它存储的是对字符串对象的引用(即内存地址),而不是字符串对象本身的内容。当你将name
重新赋值为"李四"
时,你实际上是在改变name
变量所引用的对象,而不是修改原来"张三"
字符串对象的内容。原来的"张三"
字符串对象仍然存在于内存中(至少在垃圾回收器回收它之前),但它现在不再被name
变量所引用。因此,说“字符串不是能修改”的意思是,一旦一个字符串对象被创建,你不能改变它内部存储的字符序列。但是,你可以改变一个引用变量(如
name
)来引用另一个字符串对象。
一、字符串String的创建
1-1、两种字符串的创建方式
1-2、字符串的创建方式在内存中的展示
1、直接赋值
直接直接赋值的字符串,才会出现在串池中!
代码简单,节约内存。 推荐使用直接赋值的方式创建字符串!
2、使用new关键字
每new一次就开辟一个新的地址空间。
二、字符串的比较
1、==的比较规则
2、字符串的比较
3、String类常用方法
①、String.substring()
方法
用于从一个字符串中截取子字符串。
【注意】:
使用此方法时,不需要担心原始字符串的修改,因为字符串在 Java 中是不可变的。
1、带有两个参数的版本
public String substring(int beginIndex, int endIndex)
beginIndex
(包含)和endIndex
(不包含),并返回从beginIndex
到endIndex - 1
的子字符串。如果
beginIndex
等于endIndex
,则返回空字符串。
2、只带有一个参数的版本
public String substring(int beginIndex)
返回从
beginIndex
到原始字符串末尾的子字符串。
示例:
public class Main {
public static void main(String[] args) {
String str = "Hello, World!";
// 使用两个参数的 substring 方法
String sub1 = str.substring(7, 12); // "World"
System.out.println(sub1);
// 只使用 beginIndex 的 substring 方法
String sub2 = str.substring(7); // "World!"
System.out.println(sub2);
// 注意:以下代码会抛出 StringIndexOutOfBoundsException
// String sub3 = str.substring(13, 5); // 错误的使用
}
}
②、String.toCharArray()方法
这个方法会返回一个包含字符串中所有字符的字符数组。
示例:
public class Main {
public static void main(String[] args) {
// 定义一个字符串
String str = "Hello, World!";
// 使用toCharArray()方法将字符串转换成字符数组
char[] charArray = str.toCharArray();
// 遍历字符数组并打印每个字符
for (char c : charArray) {
System.out.print(c);
}
}
}
③、String.charAt(int index)方法
用于获取字符串中指定索引处的字符。
示例:
public class Main {
public static void main(String[] args) {
String str = "Hello, World!";
// 使用charAt方法获取索引为4的字符
char ch = str.charAt(4);
// 打印字符
System.out.println(ch); // 输出: o
// 尝试获取超出范围的索引,这将抛出异常
// char outOfBoundsChar = str.charAt(str.length()); // 这会抛出StringIndexOutOfBoundsException
}
}
4、小结
如果我们看到要修改字符串的内容,可以有两个办法:
1、用substring()进行截取,把左边的字符截取出来拼接到右侧去;
2、可以把字符串先变成一个字符数组,然后调整字符数组里面数据,最后再把字符数组变成字符串。
三、StringBuilder类
当你需要频繁地修改字符串(例如,在循环中拼接字符串)时,使用 StringBuilder
可以显著提高性能。
因为 String
是不可变的,所以每次对 String
进行修改(如拼接)时,都会生成一个新的 String
对象,这会占用更多的内存,并可能导致垃圾回收器频繁工作。
3-1、StringBuilder的构造方法
3-2、StringBuilder常用方法
StringBuilder相当于是一个操作字符串的工具,用完之后,还需要将其转换成String字符串。
StringBuilder比较常用的场景:
1、字符创的拼接
2、字符串的反转
示例:
// 创建一个 StringBuilder 实例
StringBuilder sb = new StringBuilder();
// 向 StringBuilder 中添加内容
sb.append("Hello, ");
sb.append("World!");
// 插入内容
sb.insert(7, "Java ");// Hello, Java World!
// 替换内容
sb.replace(7, 11, "StringBuilder");// Hello, StringBuilder World!
// 删除内容
sb.delete(0, 5);
// 转换为 String
String result = sb.toString();
// 输出结果
System.out.println(result); // 输出 "Java StringBuilder!"
3-3、StringBuilder源码分析
四、StringJoiner类
StringJoiner
是 Java 8 引入的一个类,它位于 java.util
包中。
这个类主要用于构建由分隔符分隔的字符序列(字符串)。StringJoiner
提供了灵活的方式来添加元素,可以指定元素之间的分隔符、前缀和后缀。这使得它在处理字符串拼接时,特别是在需要构建复杂格式的字符串时,变得非常有用。
示例:
import java.util.StringJoiner;
public class StringJoinerExample {
public static void main(String[] args) {
StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Java");
sj.add("Python");
sj.add("C++");
System.out.println(sj.toString()); // 输出: [Java, Python, C++]
}
}