Bootstrap

【Java】字符串篇

String 类

String 类概述

定义与本质:
String 类是 Java 语言中的一个内置类,用于表示和操作字符串。在 Java 中,字符串是一个字符序列,是不可变对象,即一旦创建,其内容不能被修改。
存储机制:
字符串对象可以通过字符串字面量的形式创建,也可以使用 new 关键字通过构造函数创建。字符串字面量创建的字符串会存储在字符串常量池中,而通过 new 创建的字符串则在堆内存中。
功能特性:
提供了丰富的方法来操作字符串,如获取字符串长度、连接字符串、提取子串、查找字符或子串、替换字符或子串、比较字符串等。由于其不可变性,在多线程环境中可以安全地共享,且有利于字符串的缓存和复用,提高了内存利用效率和程序性能。
下面将详细讲解 String 类的使用。

创建 String 类对象

一般使用 String 类的构造方法创建一个字符串对象,可以生成一个空字符串,也可以由字符或字节数组生成字符串。以下是常用的一些方法:

  • 创建一个空字符串 public String()
  • 使用字符数组中的字符创建字符串 public String(char[] value)
  • 使用字符数组中 offset 为起始下标,count 个字符创建一个字符串 public String(char[] value,int offset,int count)
  • 使用指定的字节数组构造一个新的字符串,新字符串的长度与字符集有关,因此可能与字节数组的长度不同。 chatsetName 为使用的字符集名,如 US-ASCII、ISO-8859-1、UTF-8、UTF-16 等。如果使用了系统不支持的字符集,将抛出 UnsupportedEncodingException 异常 public String(byte[] bytes,String chatsetName)
  • 使用一个字符串对象创建字符串 public String(String original)
  • 使用 StringBuffer 对象创建字符串 public String(StringBuffer buffer)
  • 使用StringBuilder对象创建字符串 public String(StringBuilder buffer)

以下是使用这些方法创建 String 类对象的代码示例:

import java.nio.charset.StandardCharsets;

public class CreateStringObject {
   
	public static void main(String[] args) {
   
		// 创建一个空字符串
		String str = "";
		System.out.println("创建一个空字符串:" + str);
		
		// 使用字符数组中的字符创建字符串
		char[] chr1 = {
   'a','b','c','d'};
		String str1 = new String(chr1);
		System.out.println("使用字符数组中的字符创建字符串:" + str1);
		
		//使用字符数组中offset为起始下标,count个字符创建一个字符串
		char[] chr2 = {
   'a','b','中','国','牛','逼','c','d'};
		String str2 = new String(chr2, 2, 4);
		System.out.println("使用字符数组中offset为起始下标,count个字符创建一个字符串:" + str2);
		
		// 使用指定的字节数组构造一个新的字符串
		byte[] byteArray = {
   72, 101, 108, 108, 111};
		String str3 = new String(byteArray, StandardCharsets.UTF_8);
        System.out.println("使用 UTF-8 字符编码构造的字符串: " + str3);
        
        // 使用一个字符串对象创建字符串
        String str4 = new String(str2);
        System.out.println("使用一个字符串对象创建的字符串: " + str4); 
        
        // 使用StringBuffer对象创建字符串
        StringBuffer buffer = new StringBuffer("World");
        String str5 = new String(buffer);
        System.out.println("使用StringBuffer对象创建的字符串: " + str5);

        // 使用StringBuilder对象创建字符串
        StringBuilder builder = new StringBuilder("Java");
        String str6 = new String(builder);
        System.out.println("使用StringBuilder对象创建的字符串: " + str6);
	}
}

程序运行结果如下:

创建一个空字符串:
使用字符数组中的字符创建字符串:abcd
使用字符数组中offset为起始下标,count个字符创建一个字符串:中国牛逼
使用 UTF-8 字符编码构造的字符串: Hello
使用一个字符串对象创建的字符串: 中国牛逼
使用StringBuffer对象创建的字符串: World
使用StringBuilder对象创建的字符串: Java

字符串基本操作

在学习字符串基本操作之前,首先了解一下字符串在内存中的表示。以下是创建一个字符串对象的代码示例:

String str = new String("Java is cool");

该字符串对象在内存中的状态如下图所示:
在这里插入图片描述

该字符串共包含 12 个字符,即长度为 12,其中每个字符都有一个下标,下标从 0 开始,可以通过下标访问每个字符。

注意:在字符串中,空格也占有内存空间。

接下来将学习字符串的一些基本操作,调用 String 类的方法操作字符串:

  • 返回字符串的长度,即字符串包含的字符个数 public int length()
  • 从字符串的下标 beginIndex 开始到 endIndex 结束产生一个子字符串 public String substring(int beginIndex,int endIndex)
  • 从字符串的下标 beginIndex 开始到结束产生一个子字符串 public String substring(int beginIndex)
  • 将字符串转换成大写字母 public String toUpperCase()
  • 将字符串转换成小写字母 public String toLowerCase()
  • 返回删除了前后空白字符的字符串对象 public String trim()
  • 返回该字符串是否为空 public boolean isEmpty()
  • 将调用字符串与参数字符串连接起来,产生一个新的字符串 public String concat(String str)
  • 将字符串中的所有 oldChar 字符改为 newChar 字符,返回一个新的字符串 public String replace(char oldChar,char newChar)
  • 返回字符串中指定位置的字符 public char charAt(int Index)
  • 将参数的基本类型double值转换为字符串 public static String valueOf(double d)

以下是使用这些基本操作的代码示例:

public class StringBasicOperations {
   
	public static void main(String[] args) {
   
		String str = " Java is cool ";
		System.out.println("创建了一个字符串对象 str :" + str);
		System.out.println();
		
		// 返回字符串的长度,即字符串包含的字符个数
		int length = str.length();
		System.out.println("字符串 str 的长度为:" + length);
		System.out.println();
		
		// 从字符串的下标 beginIndex 开始到 endIndex 结束产生一个子字符串
		String str1 = str.substring(1, 5);
		System.out.println("从字符串 str 的下标 5 开始到 7 结束产生的子字符串 str1 为:" + str1);
		System.out.println();
		
		// 从字符串的下标 beginIndex 开始到结束产生一个子字符串
		String str2 = str.substring(5);
		System.out.println("从字符串 str 的下标 5 开始到结束产生一个子字符串 str2 为:" + str2);
		System.out.println();
		
		// 将字符串转换成大写字母
		String str3 = str.toUpperCase();
		System.out.println("将字符串 str 转换成大写字母:" + str3);
		System.out.println();
		
		// 将字符串转换成小写字母
		String str4 = str.toLowerCase();
		System.out.println("将字符串 str 转换成小写字母:" + str4);
		System.out.println();
		
		// 返回删除了前后空白字符的字符串对象
		String str5 = str.trim();
		System.out.println("字符串 str 删除前后空白字符为:" + str5);
		System.out.println();
		
		// 返回该字符串是否为空
		boolean result = str.isEmpty();
		System.out.println("字符串 str 是否为空::" + result);
		System.out.println();
		
		// 将调用字符串与参数字符串连接起来,产生一个新的字符串
		String str6 = str1.concat(str2);
		System.out.println("将字符串 str1 和 str2 连接产生的新字符串 str6 为:" + str6);
		System.out.println();
		
		// 将字符串中的所有 oldChar 字符改为 newChar 字符,返回一个新的字符串
		String str7 = str4.replace('o', 'O');
		System.out.println("将字符串 str4 中的小写o全部改成大写O:" + str7);
		System.out.println();
		
		// 返回字符串中指定位置的字符
		char chr = str.charAt(6);
		System.out.println("返回字符串 str 中索引为 6 的字符:" + chr);
		System.out.println();
		
		// 将参数的基本类型double值转换为字符串
		double num = 3.14;
        String str8 = String.valueOf(num);
        System.out.println("转换后的字符串: " + str8);
        System.out.println("转换后的字符串类型: " + str8.getClass().getName());
	}
}

程序运行结果如下:

创建了一个字符串对象 str : Java is cool 

字符串 str 的长度为:14

从字符串 str 的下标 5 开始到 7 结束产生的子字符串 str1 为:Java

从字符串 str 的下标 5 开始到结束产生一个子字符串 str2 为: is cool 

将字符串 str 转换成大写字母: JAVA IS COOL 

将字符串 str 转换成小写字母: java is cool 

字符串 str 删除前后空白字符为:Java is cool

字符串 str 是否为空::false

将字符串 str1 和 str2 连接产生的新字符串 str6 为:Java is cool 

将字符串 str4 中的小写o全部改成大写O: java is cOOl 

返回字符串 str 中索引为 6 的字符:i

转换后的字符串:
;