跳到主要内容

Java 字符串创建

什么是Java字符串?

在Java中,字符串是一个对象,它代表一系列字符。Java提供了String类来创建和操作字符串。与其他编程语言不同,Java中的字符串是不可变的(immutable),这意味着一旦创建,字符串的内容就不能被修改。

字符串的创建方式

在Java中,可以通过多种方式创建字符串。让我们逐一了解这些方法。

1. 使用字符串字面量

最简单也是最常用的方式是使用字符串字面量(直接在双引号中写入内容):

java
String greeting = "Hello, World!";

当使用字符串字面量创建字符串时,JVM会首先检查字符串常量池中是否已经存在相同内容的字符串。如果存在,则直接引用常量池中的字符串;如果不存在,则在常量池中创建新的字符串并返回引用。

2. 使用new关键字

另一种创建字符串的方式是使用new关键字:

java
String greeting = new String("Hello, World!");

使用new关键字会在堆内存中创建一个新的字符串对象,即使内容相同,也会创建新的对象。

3. 使用字符数组

可以使用字符数组来创建字符串:

java
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String greeting = new String(charArray);
System.out.println(greeting); // 输出: Hello

4. 通过其他字符串构建

可以通过连接现有字符串或使用StringBuilder/StringBuffer来构建新的字符串:

java
String first = "Hello";
String second = "World";
String combined = first + ", " + second + "!";
System.out.println(combined); // 输出: Hello, World!

StringBuilder builder = new StringBuilder();
builder.append("Hello");
builder.append(", ");
builder.append("World!");
String result = builder.toString();
System.out.println(result); // 输出: Hello, World!

字符串常量池

Java的字符串常量池是一个特殊的内存区域,用于存储字符串字面量。它的目的是节省内存并提高性能。

常量池与堆内存的区别

让我们通过一个例子来理解字符串常量池和堆内存中字符串的区别:

java
String str1 = "Hello"; // 存储在字符串常量池中
String str2 = "Hello"; // 引用常量池中的同一个对象
String str3 = new String("Hello"); // 在堆中创建新对象

System.out.println(str1 == str2); // 输出: true(相同引用)
System.out.println(str1 == str3); // 输出: false(不同引用)
System.out.println(str1.equals(str3)); // 输出: true(内容相同)
备注

==操作符比较的是对象的引用(内存地址),而equals()方法比较的是字符串的内容。

字符串的一些常用方法

Java的String类提供了许多有用的方法来处理字符串:

java
String text = "Java Programming";

// 获取字符串长度
int length = text.length();
System.out.println("长度: " + length); // 输出: 长度: 16

// 获取特定位置的字符
char character = text.charAt(0);
System.out.println("第一个字符: " + character); // 输出: 第一个字符: J

// 字符串截取
String subStr = text.substring(0, 4);
System.out.println("截取的子字符串: " + subStr); // 输出: 截取的子字符串: Java

// 字符串替换
String replaced = text.replace("Java", "Python");
System.out.println("替换后的字符串: " + replaced); // 输出: 替换后的字符串: Python Programming

// 检查字符串是否包含某个子字符串
boolean contains = text.contains("Program");
System.out.println("包含'Program': " + contains); // 输出: 包含'Program': true

// 转换大小写
String upperCase = text.toUpperCase();
System.out.println("转换为大写: " + upperCase); // 输出: 转换为大写: JAVA PROGRAMMING

实际案例:用户输入验证

以下是一个实际应用场景,我们使用字符串处理来验证用户输入的电子邮箱格式:

java
public class EmailValidator {
public static void main(String[] args) {
String email1 = "user@example.com";
String email2 = "invalid-email";

System.out.println(email1 + " 是有效的电子邮箱吗? " + isValidEmail(email1));
System.out.println(email2 + " 是有效的电子邮箱吗? " + isValidEmail(email2));
}

public static boolean isValidEmail(String email) {
// 简单验证:包含@符号且@后面有点
if (email == null) {
return false;
}

int atIndex = email.indexOf('@');
if (atIndex <= 0) {
return false;
}

int dotIndex = email.indexOf('.', atIndex);
return dotIndex > atIndex + 1 && dotIndex < email.length() - 1;
}
}

输出结果:

user@example.com 是有效的电子邮箱吗? true
invalid-email 是有效的电子邮箱吗? false

字符串创建的最佳实践

  1. 避免在循环中使用+运算符连接字符串:这会创建多个中间字符串对象,影响性能。请使用StringBuilderStringBuffer
java
// 不推荐
String result = "";
for (int i = 0; i < 10000; i++) {
result += i;
}

// 推荐
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10000; i++) {
builder.append(i);
}
String result = builder.toString();
  1. 合理选择创建方式:如果不需要创建新对象,优先使用字符串字面量而不是new String()

  2. 使用equals()而不是==比较字符串内容==比较的是引用,而不是字符串的内容。

提示

在Java 9及更高版本中,可以使用String.intern()方法手动将字符串添加到常量池中。

总结

在Java中,字符串是非常基础且常用的数据类型。了解字符串的创建方式及其特性对于编写高效的Java程序至关重要。字符串是不可变的,这在一定程度上提高了安全性和性能,但也需要在处理大量字符串操作时特别注意效率问题。

练习

  1. 创建一个程序,比较使用字符串字面量和new String()创建的字符串的区别。
  2. 编写代码,统计一个字符串中特定字符出现的次数。
  3. 实现一个简单的字符串反转功能。
  4. 创建一个程序,将用户输入的句子按单词反转(例如"Hello World"变为"World Hello")。

延伸阅读