跳到主要内容

Java 字符串基础

什么是Java字符串?

在Java编程中,字符串是最常用的数据类型之一,用于存储和操作文本数据。Java中的字符串是由String类表示的,它是一个引用类型,不是基本数据类型。字符串实际上是字符的序列,每个字符都是一个Unicode字符。

备注

在Java中,字符串是不可变的(immutable),这意味着一旦创建,其内容就不能被修改。任何看似修改字符串的操作实际上都是创建了一个新的字符串对象。

创建字符串

在Java中,有多种方式可以创建字符串:

1. 使用字符串字面值

最简单的方式是使用双引号创建字符串字面值:

java
String greeting = "Hello, World!";

2. 使用new关键字

可以使用new关键字和String构造函数创建字符串:

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

3. 使用字符数组

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

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

字符串连接

Java提供了多种方式来连接(拼接)字符串:

1. 使用+运算符

java
String firstName = "John";
String lastName = "Doe";
String fullName = firstName + " " + lastName;
System.out.println(fullName); // 输出: John Doe

2. 使用concat()方法

java
String firstName = "John";
String lastName = "Doe";
String fullName = firstName.concat(" ").concat(lastName);
System.out.println(fullName); // 输出: John Doe

3. 使用StringBuilder或StringBuffer

当需要执行大量字符串连接操作时,推荐使用StringBuilder(非线程安全)或StringBuffer(线程安全):

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

字符串常用方法

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

1. 长度方法

java
String text = "Hello";
int length = text.length(); // 返回5

2. 字符访问方法

java
String text = "Hello";
char firstChar = text.charAt(0); // 返回'H'

3. 子字符串方法

java
String text = "Hello, World!";
String sub1 = text.substring(0, 5); // 返回"Hello"
String sub2 = text.substring(7); // 返回"World!"

4. 字符串比较方法

java
String str1 = "Hello";
String str2 = "hello";

// 比较两个字符串(区分大小写)
boolean isEqual = str1.equals(str2); // 返回false

// 比较两个字符串(不区分大小写)
boolean isEqualIgnoreCase = str1.equalsIgnoreCase(str2); // 返回true

// 比较字符串的顺序
int result = str1.compareTo(str2); // 返回负数,因为'H'在ASCII表中小于'h'

5. 查找方法

java
String text = "Hello, World!";
int index1 = text.indexOf('o'); // 返回4
int index2 = text.lastIndexOf('o'); // 返回8
boolean contains = text.contains("World"); // 返回true

6. 修改方法

java
String text = "  Hello, World!  ";
String trimmed = text.trim(); // 返回"Hello, World!"(去除两端空白)
String upper = text.toUpperCase(); // 返回" HELLO, WORLD! "
String lower = text.toLowerCase(); // 返回" hello, world! "
String replaced = text.replace('o', 'x'); // 返回" Hellx, Wxrld! "

字符串的不可变性

Java字符串的一个关键特性是它们是不可变的。这意味着一旦创建,字符串对象的内容就不能被改变。

java
String str = "Hello";
str.concat(" World"); // 这行代码创建了一个新字符串,但没有赋值给任何变量
System.out.println(str); // 输出仍然是 "Hello"

// 正确的方式是将结果赋值给一个变量
str = str.concat(" World"); // 现在str引用了新创建的字符串
System.out.println(str); // 输出是 "Hello World"
提示

字符串的不可变性有很多好处,包括:

  • 可以安全地在多线程环境中共享字符串
  • 字符串池可以提高内存效率
  • 字符串可以用作HashMap或HashSet的键

字符串池

Java为了提高性能和减少内存开销,维护了一个称为"字符串池"或"字符串常量池"的特殊内存区域。

java
String s1 = "Hello"; // 创建一个字符串并放入池中
String s2 = "Hello"; // 重用池中的同一个字符串
String s3 = new String("Hello"); // 在堆内存中创建一个新的字符串对象

System.out.println(s1 == s2); // 输出: true(同一个对象)
System.out.println(s1 == s3); // 输出: false(不同对象)
System.out.println(s1.equals(s3)); // 输出: true(内容相同)

实际应用案例

案例1:用户输入验证

java
import java.util.Scanner;

public class UserInputValidator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的电子邮箱: ");
String email = scanner.nextLine();

// 使用字符串方法验证电子邮箱格式
if (email.contains("@") && email.contains(".") &&
email.indexOf("@") < email.lastIndexOf(".")) {
System.out.println("电子邮箱格式有效!");
} else {
System.out.println("电子邮箱格式无效!");
}
scanner.close();
}
}

案例2:文本处理

java
public class TextProcessor {
public static void main(String[] args) {
String text = "Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性。";

// 计算单词数(简化版,假设以空格分隔)
String[] words = text.split(" ");
System.out.println("文本中的单词数: " + words.length);

// 查找特定单词
boolean containsJava = text.contains("Java");
System.out.println("文本中包含'Java':" + containsJava);

// 替换特定单词
String updatedText = text.replace("Java", "JAVA");
System.out.println("更新后的文本: " + updatedText);
}
}

案例3:字符串构建性能比较

java
public class StringPerformanceTest {
public static void main(String[] args) {
// 使用+运算符
long startTime1 = System.currentTimeMillis();
String result1 = "";
for (int i = 0; i < 10000; i++) {
result1 += "a";
}
long endTime1 = System.currentTimeMillis();

// 使用StringBuilder
long startTime2 = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("a");
}
String result2 = sb.toString();
long endTime2 = System.currentTimeMillis();

System.out.println("使用+运算符耗时:" + (endTime1 - startTime1) + "毫秒");
System.out.println("使用StringBuilder耗时:" + (endTime2 - startTime2) + "毫秒");
}
}

总结

在本文中,我们学习了Java字符串的基础知识,包括:

  1. 字符串的创建方式
  2. 字符串连接的不同方法
  3. 常用的字符串操作方法
  4. 字符串的不可变性及其影响
  5. 字符串池的概念
  6. 实际应用中的字符串处理案例

字符串处理是几乎所有Java应用程序的核心部分。掌握字符串的基础知识对于成为一名高效的Java程序员至关重要。随着经验的积累,你会发现更多高级的字符串处理技巧和模式。

练习

为了加强学习,尝试完成以下练习:

  1. 编写一个程序,统计一个字符串中元音字母的数量。
  2. 实现一个方法,检查一个字符串是否是回文(正读和反读都一样)。
  3. 创建一个程序,将一个句子中的单词按字母顺序排序。
  4. 开发一个简单的密码强度检查器,验证密码是否包含大小写字母、数字和特殊字符。

附加资源

如需更深入了解Java字符串,可以参考以下资源:

  • Java官方文档的String类API
  • 《Effective Java》第三版,第六章关于"避免创建不必要的对象"的内容
  • 《Java核心技术》卷I中关于字符串处理的章节

Happy coding!