Java中常见字符串操作

文章目录

      • [1. 字符串的创建](#1. 字符串的创建)
      • [2. 字符串的拼接](#2. 字符串的拼接)
      • [3. 字符串的比较](#3. 字符串的比较)
      • [4. 字符串的查找](#4. 字符串的查找)
      • [5. 字符串的截取](#5. 字符串的截取)
        • [`substring(int beginInde)` 方法](#substring(int beginInde) 方法)
        • [`substring()` 方法](#substring() 方法)
      • [6. 字符串的替换](#6. 字符串的替换)
        • [`replace()` 方法](#replace() 方法)
        • [`replace()` 方法](#replace() 方法)
        • [`replaceAll()` 方法](#replaceAll() 方法)
      • [7. 字符串的分割](#7. 字符串的分割)
        • [`split(String regex)` 方法](#split(String regex) 方法)
      • [8. 字符串的大小写转换](#8. 字符串的大小写转换)
        • [`toUpperCase()` 方法](#toUpperCase() 方法)
        • [`toLowerCase()` 方法](#toLowerCase() 方法)
      • [9. 字符串的去除空白](#9. 字符串的去除空白)
        • [`trim()` 方法](#trim() 方法)
      • [10. 字符串的长度获取](#10. 字符串的长度获取)
        • [`length()` 方法](#length() 方法)
      • [11. 字符串与字符数组的转换](#11. 字符串与字符数组的转换)
      • [12. 字符串与字节数组的转换](#12. 字符串与字节数组的转换)

在 Java 里,字符串操作是编程中经常会用到的内容。 String 类提供了大量实用的方法来处理字符串。以下是对常见字符串操作的详细介绍:

1. 字符串的创建

  • 使用字符串字面量:这是最常用的方式,字符串字面量会存储在字符串常量池中。
java 复制代码
String str1 = "Hello";

当使用字符串字面量创建字符串时,Java 会首先检查字符串常量池(也称为串池)中是否已经存在相同内容的字符串。如果存在,就直接返回该字符串在串池中的引用;如果不存在,就在串池中创建一个新的字符串对象,并返回其引用。例如:

java 复制代码
String str2 = "Hello";
System.out.println(str1 == str2); // 输出 true,因为 str1 和 str2 指向串池中
  • 使用 new 关键字:会在堆内存中创建新的字符串对象。
java 复制代码
String str2 = new String("World");

使用 new 关键字创建字符串对象时,无论串池中是否已经存在相同内容的字符串,都会在堆内存中创建一个新的字符串对象。例如:

java 复制代码
String str4 = new String("World");
System.out.println(str3 == str4); // 输出 false,因为 str3 和 str4 是堆内存

2. 字符串的拼接

  • 使用 + 运算符:可拼接字符串字面量、变量和其他数据类型,操作简单,但在循环中频繁使用会影响性能。
java 复制代码
String str1 = "Hello";
String str2 = "World";
String result1 = str1 + " " + str2;

+ 运算符是最常用的字符串拼接方式,它可以用于拼接字符串字面量、字符串变量以及其他数据类型。+ 运算符的一侧是字符串时,另一侧的操作数会被自动转换为字符串类型 。不过,在循环中频繁使用 + 运算符进行字符串拼接会导致性能问题,因为每次拼接都会创建一个新的字符串对象。例如:

java 复制代码
String result = "";
for (int i = 0; i < 1000; i++) {
    result = result + i;
}

上述代码在循环中会创建大量的临时字符串对象,消耗大量的内存和时间。

  • 使用 concat() 方法String 类的方法,只能拼接字符串类型。
java 复制代码
String result2 = str1.concat(" ").concat(str2);

concat() 方法是 String 类提供的用于拼接字符串的方法,它接受一个字符串参数,并将该字符串拼接在调用该方法的字符串后面。与 + 运算符相比,concat() 方法在某些场景下性能稍好,因为它不会创建多余的中间对象。但 concat() 方法只能拼接字符串类型,不能直接拼接其他数据类型,需要先将其他数据类型转换为字符串。例如:

java 复制代码
int num = 123;
// 报错,不能直接拼接整数
// String result = str1.concat(num); 
String result = str1.concat(String.valueOf(num));
  • 使用 StringBuilderStringBuffer :适用于大量字符串拼接,StringBuilder 非线程安全,性能好;StringBuffer 线程安全。
java 复制代码
StringBuilder sb = new StringBuilder();
sb.append(str1).append(" ").append(str2);
String result3 = sb.toString();

StringBuilderStringBuffer 都是可变的字符序列,它们提供了 append() 方法用于拼接字符串。StringBuilder 是非线程安全的,性能较高;StringBuffer 是线程安全的,但性能相对较低。在大量字符串拼接的场景下,特别是在循环中,建议使用 StringBuilderStringBuffer。例如:

java 复制代码
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i);
}
String result = sb.toString();

3. 字符串的比较

  • 使用 equals() 方法:比较两个字符串的内容是否相同。
java 复制代码
String str1 = "Hello";
String str2 = "Hello";
boolean isEqual1 = str1.equals(str2);

equals() 方法用于比较两个字符串的内容是否相同 。它会逐个比较两个字符串中的字符,如果所有字符都相同,则返回 true,否则返回 false。例如:

java 复制代码
String str3 = "hello";
System.out.println(str1.equals(str3)); // 输出 false,因为大小写不同
  • 使用 equalsIgnoreCase() 方法 :比较字符串内容,忽略大小写
java 复制代码
String str3 = "hello";
boolean isEqual2 = str1.equalsIgnoreCase(str3);

equalsIgnoreCase() 方法用于比较两个字符串的内容是否相同,忽略大小写。例如:

java 复制代码
System.out.println(str1.equalsIgnoreCase(str3)); // 输出 true,忽略大小写
  • 使用 == 运算符:比较两个字符串的引用是否相同。
java 复制代码
boolean isSame = str1 == str2;

== 运算符用于比较两个字符串的引用是否相同,即判断它们是否指向内存中的同一个对象。例如:

java 复制代码
String str4 = new String("Hello");
System.out.println(str1 == str4); // 输出 false,因为 str1 和 str4 指向不同

4. 字符串的查找

  • indexOf() 方法:返回指定字符或子字符串首次出现的索引,若未找到返回 -1。
java 复制代码
String str = "Hello World";
int index1 = str.indexOf("World");

indexOf() 方法用于返回指定字符或子字符串首次出现的索引。如果未找到,则返回 -1。例如:

java 复制代码
int index2 = str.indexOf("Java");
System.out.println(index2); // 输出 -1,因为字符串中不包含 "Java"

indexOf() 方法还有一个重载形式 indexOf(int ch, int fromIndex),用于从指定的索引位置开始查找字符。例如:

java 复制代码
int index3 = str.indexOf('l', 3);
System.out.println(index3); // 输出 3,从索引 3 开始查找字符 'l'
  • lastIndexOf() 方法 :返回指定字符或子字符串最后一次出现的索引,未找到返回 -1。
java 复制代码
int index2 = str.lastIndexOf("l");

lastIndexOf() 方法用于返回指定字符或子字符串最后一次出现的索引。如果未找到,则返回 -1。例如:

java 复制代码
int index5 = str.lastIndexOf("Java");
System.out.println(index5); // 输出 -1,因为字符串中不包含 "Java"

lastIndexOf() 方法也有一个重载形式 lastIndexOf(int ch, int fromIndex),用于从指定的索引位置开始向前查找字符。例如:

java 复制代码
int index6 = str.lastIndexOf('l', 4);
System.out.println(index6); // 输出 3,从索引 4 开始向前查找字符 'l'
  • contains() 方法 :判断字符串是否包含指定的子字符串
java 复制代码
boolean contains = str.contains("Hello");

contains() 方法用于判断字符串是否包含指定的子字符串。如果包含,则返回 true,否则返回 false。例如:

java 复制代码
boolean containsJava = str.contains("Java");
System.out.println(containsJava); // 输出 false,因为字符串中不包含 "Java"

5. 字符串的截取

substring(int beginInde) 方法
java 复制代码
String subStr1 = str.substring(6);

substring(int beginIndex) 方法用于从指定的索引位置开始截取到字符串的末尾。例如:

java 复制代码
System.out.println(subStr1); // 输出 "World"
substring() 方法
java 复制代码
String subStr2 = str.substring(0, 5);

substring(int beginIndex, int endIndex) 方法用于beginIndex 开始截取到 endIndex - 1 的位置。例如:

java 复制代码
System.out.println(subStr2); // 输出 "Hello"

需要注意的是,beginIndex 必须大于等于 0,endIndex 必须大于 beginIndex 且小于等于字符串的长度 ,否则会抛出 StringIndexOutOfBoundsException 异常。

6. 字符串的替换

replace() 方法
java 复制代码
String replaced1 = str.replace('l', 'L');

replace(char oldChar, char newChar) 方法用于将字符串中所有的 oldChar 替换为 newChar。例如:

java 复制代码
System.out.println(replaced1); // 输出 "HeLLo WorLd"
replace() 方法
java 复制代码
String replaced2 = str.replace("World", "Java");

replace(CharSequence target, CharSequence replacement) 方法用于将字符串中所有的 target 子字符串替换为 replacement。例如:

java 复制代码
System.out.println(replaced2); // 输出 "Hello Java"
replaceAll() 方法
java 复制代码
String replaced3 = str.replaceAll("\\s", "");

replaceAll(String regex, String replacement) 方法使用正则表达式替换所有匹配的子字符串。例如,上述代码将字符串中的所有空格替换为空字符串。需要注意的是,正则表达式中的特殊字符需要进行转义。例如:

java 复制代码
String strWithDigits = "abc123def456";
String replaced4 = strWithDigits.replaceAll("\\d", "");
System.out.println(replaced4); // 输出 "abcdef",将所有数字替换为空字符串

7. 字符串的分割

split(String regex) 方法
java 复制代码
String[] parts = str.split(" ");

split(String regex) 方法根据正则表达式将字符串分割成字符串数组。例如,上述代码将字符串按空格分割成多个子字符串。例如:

java 复制代码
for (String part : parts) {
    System.out.println(part);
}

输出结果为:

plaintext 复制代码
Hello
World

split() 方法还有一个重载形式 split(String regex, int limit),用于指定分割的最大次数。例如:

java 复制代码
String[] parts2 = str.split(" ", 2);
for (String part : parts2) {
    System.out.println(part);
}

输出结果为:

plaintext 复制代码
Hello
World

在这个例子中,由于 limit 为 2,所以最多分割成 2 个部分。

8. 字符串的大小写转换

toUpperCase() 方法
java 复制代码
String upperCase = str.toUpperCase();

toUpperCase() 方法用于将字符串转换为大写形式。例如:

java 复制代码
System.out.println(upperCase); // 输出 "HELLO WORLD"
toLowerCase() 方法
java 复制代码
String lowerCase = str.toLowerCase();

toLowerCase() 方法用于将字符串转换为小写形式。例如:

java 复制代码
System.out.println(lowerCase); // 输出 "hello world"

9. 字符串的去除空白

trim() 方法
java 复制代码
String strWithSpaces = "  Hello World  ";
String trimmed = strWithSpaces.trim();

trim() 方法用于去除字符串首尾的空白字符。例如:

java 复制代码
System.out.println(trimmed); // 输出 "Hello World"

10. 字符串的长度获取

length() 方法
java 复制代码
int length = str.length();

length() 方法用于返回字符串的长度,即字符串中字符的个数。例如:

java 复制代码
System.out.println(length); // 输出 11

11. 字符串与字符数组的转换

字符串转字符数组
java 复制代码
char[] charArray = str.toCharArray();

toCharArray() 方法用于将字符串转换为字符数组。例如:

java 复制代码
for (char c : charArray) {
    System.out.print(c + " ");
}

输出结果为:

plaintext 复制代码
H e l l o   W o r l d 
字符数组转字符串
java 复制代码
char[] charArray2 = {'H', 'e', 'l', 'l', 'o'};
String newStr = new String(charArray2);

可以使用 String 类的构造方法将字符数组转换为字符串。例如:

java 复制代码
System.out.println(newStr); // 输出 "Hello"

12. 字符串与字节数组的转换

字符串转字节数组
java 复制代码
byte[] byteArray = str.getBytes();

getBytes() 方法用于将**字符串转换为字节数组**。默认情况下,使用平台的默认字符集进行编码。也可以指定字符集,例如:

java 复制代码
try {
    byte[] byteArray2 = str.getBytes("UTF-8");
} catch (java.io.UnsupportedEncodingException e) {
    e.printStackTrace();
}
java 复制代码
字节数组转字符串
byte[] byteArray3 = {72, 101, 108, 108, 111};
String newStr2 = new String(byteArray3);

可以使用 String 类的构造方法将**字节数组转换为字符串**。默认情况下,使用平台的默认字符集进行解码。也可以指定字符集,例如:

java 复制代码
try {
    String newStr3 = new String(byteArray3, "UTF-8");
} catch (java.io.UnsupportedEncodingException e) {
    e.printStackTrace();
}
相关推荐
Blossom.1183 分钟前
基于Python的机器学习入门指南
开发语言·人工智能·经验分享·python·其他·机器学习·个人开发
郝YH是人间理想1 小时前
Python面向对象
开发语言·python·面向对象
大刀爱敲代码2 小时前
基础算法01——二分查找(Binary Search)
java·算法
大土豆的bug记录3 小时前
鸿蒙进行视频上传,使用 request.uploadFile方法
开发语言·前端·华为·arkts·鸿蒙·arkui
追风少年1554 小时前
常见中间件漏洞之一 ----【Tomcat】
java·中间件·tomcat
yang_love10115 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
hhw1991125 小时前
c#知识点补充3
开发语言·c#
Antonio9155 小时前
【Q&A】观察者模式在QT有哪些应用?
开发语言·qt·观察者模式
Pandaconda5 小时前
【后端开发面试题】每日 3 题(二十)
开发语言·分布式·后端·面试·消息队列·熔断·服务限流
郑州吴彦祖7725 小时前
【Java】UDP网络编程:无连接通信到Socket实战
java·网络·udp