1.String类概述

String 类对象代表不可变的Unicode字符序列。什么叫做“不可变的对象”?指的是对象内部的成员变量的值无法再改变。我们打开String类的源码:

java去右侧空格 java去掉空格_字符串


我们发现字符串内容全部存储到value[]数组中,而且该数组是final类型,也就是常量(即只能被赋值一次),这就是“不可变对象”的典型定义方式。

虽然字符串本身不能改变,但是String类型变量中记录的地址值是可以改变的。

【示例】字符串多次赋值案例

public static void main(String[] args) {
	// 方法栈中的str指向堆中的某个地址
	String str = new String("bjsxt");
	// 方法栈中的str指向堆中的另一个地址
	str = "whsxt";
}

执行该代码时, str引用先指向堆中的一个字符串(“bjsxt”),然后紧接着 str 又指向堆中另外一个字符串(“whsxt”),此时字符串"bjsxt"就没有引用再指向它了。

【思考】如何实现两个字符串变量值的交换?

2.String类构造方法

String()

初始化新创建的String对象,使其表示空字符序列。

String(String original)

初始化新创建的String对象,新创建的字符串是参数字符串的副本。

String(byte[] bytes)

通过使用平台的默认字符集解码指定的字节数组来构造新的String。

String(char[] value)

分配一个新的String,以便它表示当前包含在字符数组参数中的字符序列。

【示例】字符串构造方法使用案例

// 1.创建一个空字符串
String str1 = new String(); // 存储内容:""
// 2.通过常量字符串来创建字符串
String str2 = new String("whsxt"); // 存储内容:"whsxt"
// 3.通过byte数组来创建字符串
byte[] bytes = new byte[] {65, 66, 67, 68, 69}; 
// 3.1把byte数组全部元素作为字符串的内容来创建字符串
String str3 = new String(bytes); // 存储内容:"ABCDE"
// 4.通过char数组来创建字符串
char[] chars = new char[] {'a', 'b', 'c', 'd', 'e'};
// 4.1把char数组全部元素作为字符串的内容来创建字符串
String str4 = new String(chars); // 存储内容:"abcde"

通过 String 类的构造方法可以完成字符串对象的创建,那么通过使用双引号的方式创建对象与 new 的方式创建对象,有什么不同呢?

【示例】两种字符串创建方式区别

// 通过双引号创建字符串
String str1 = "hello world";
// 通过构造方法创建字符串
String str2 = new String("hello world");
// 比较地址
System.out.println(str1 == str2); // 输出:false
// equals方法比较字符串内容
System.out.println(str1.equals(str2)); // 输出:true

str1 和 str2 的创建方式有什么不同呢?

  • str1创建,在内存中只有一个对象,这个对象在字符串常量池中。
  • str2创建,在内存中有两个对象。一个 new 的对象在堆中,一个字符串本身对象,在字符串常量池中。

3.String类查找方法

3.1获取字符串长度

通过String类提供的length()方法,可以获取到字符串中有多少个字符。注意区分获取数组长度和字符串长度的方式,数组是通过length属性来获取数组的长度 。

【示例】获取字符串长度案例

String str = new String("whsxt");
int length = str.length();
System.out.println("length:" + length); // 输出:5

3.2 charAt方法

char charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法。

charAt()方法返回指定索引位置的char值,索引范围为0 ~ length() – 1,如果索引越界,则抛出StringIndexOutOfBoundsException异常。

【示例】根据索引获取字符案例

String str = new String("whsxt");
// 注意:索引范围为0~length()-1
char c1 = str.charAt(3);
System.out.println(c1); // 输出:'x'
// 如果索引越界,抛出StringIndexOutOfBoundsException异常
char c2 = str.charAt(8); // 运行抛出异常

3.3 indexOf方法

通过indexOf方法,获取字符&子字符串在指定字符串中第一次出现的位置(从前往后查找)。

indexOf方法返回一个整数值,该整数值就是字符或子字符串在指定字符串中所在的位置,如果没有找到则返回-1。如果fromIndex是负数,则fromIndex被当作零,如果它比最大的字符位置索引还大,则它被当作最大的可能索引。

int indexOf(int ch)

返回指定字符第一次出现在字符串内的索引。

int indexOf(int ch, int fromIndex)

返回指定字符第一次出现在字符串内的索引,以指定的索引开始搜索。

int indexOf(String str)

返回指定子字符串第一次出现在字符串内的索引。

int indexOf(String str, int fromIndex)

返回指定子串的第一次出现在字符串中的索引,从指定的索引开始搜索。

【示例】indexOf方法案例

String str = "hello-world-hello-world";
// 1. 获取指定字符在字符串中的第一次出现的位置,如果字符不存在返回-1
int index1 = str.indexOf('o');
System.out.println("index:" + index1); // 输出:4
// 2. 获取指定字符第一次出现在字符串中的位置,以指定的索引开始搜索,如果字符不存在返回-1
int index2 = str.indexOf('o', 5);
System.out.println("index:" + index2); // 输出:7
// 3.获取指定子字符串在字符串中第一次出现的位置,如果字符不存在返回-1
int index3 = str.indexOf("llo");
System.out.println("index:" + index3); // 输出:2
// 4.获取指定字符串第一次出现的字符串中的位置,以指定的索引开始搜索,如果字符不存在返回-1
int index4 = str.indexOf("llo", 9);
System.out.println("index:" + index4); // 输出:14

3.4 lastIndexOf方法

通过lastIndexOf方法,获取字符&子字符串在指定字符串中最后一次出现的位置(从后往前查找)。lastIndexOf方法返回一个整数值,该整数值就是字符或子字符串在指定字符串中所在的位置,如果没有找到则返回-1。如果fromIndex是负数,则fromIndex被当作零,如果它比最大的字符位置索引还大,则它被当作最大的可能索引。

int lastIndexOf(int ch)

返回指定字符最后一次出现在字符串内的索引。

int lastIndexOf(int ch, int fromIndex)

返回指定字符最后一次出现在字符串内的索引,以指定的索引开始搜索。

int lastIndexOf (String str)

返回指定子字符串最后一次出现在字符串内的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子串的最后一次出现在字符串中的索引,从指定的索引开始搜索。

【示例】lastIndexOf方法案例

String str = "hello-world-hello-world";
// 1.获取指定字符在字符串中的最后一次出现的位置,如果字符不存在返回-1
int index1 = str.lastIndexOf('o'); 
System.out.println("index:" + index1); // 返回:19
// 2.获取指定字符最后一次出现在字符串中的位置,以指定的索引开始搜索,如果字符不存在返回-1
int index2 = str.lastIndexOf('o', 15);
System.out.println("index:" + index2); // 返回:7
// 3.获取指定子字符串在字符串中最后一次出现的位置,如果字符不存在返回-1
int index3 = str.lastIndexOf("llo");
System.out.println("index:" + index3); // 返回:14
// 4.获取指定字符串最后一次出现在字符串中的位置,以指定的索引开始搜索,如果字符不存在返回-1
int index4 = str.lastIndexOf("llo", 9);
System.out.println("index:" + index4); // 返回:2

3.5 startsWith方法

startsWith([String] prefix)方法,判断字符串是否以指定字符串开头,返回值为boolean类型。

【示例】startsWith方法案例

String url = "http://www.whsxt.com";
// 判断url是否采用的http:协议,就是判断字符串是否以"http:"开头
boolean flag = url.startsWith("http:");
System.out.println("flag:" + flag); // 输出:true

3.6 endsWith方法

endsWith(String prefix)方法,判断字符串是否以指定字符串结尾,返回值为boolean类型。

【示例】endsWith方法案例

String url = "http://www.whsxt.com";
// 判断网站域名是否是.cn域名,也就是判断字符串是否以.cn结尾
boolean flag = url.endsWith(".cn");
System.out.println("flag:" + flag); // 输出:false

3.7 contains方法

contains(CharSequence s)方法,判断字符串中是否包含指定字符串,返回值为boolean类型。

CharSequence是一个接口,String类是该接口的实现类,所以contains方法的参数可以为字符串。

【示例】contains方法案例

String url = "http://www.whsxt.com";
// 判断字符串中是否包含"whsxt"
boolean flag = url.contains("whsxt");
System.out.println("flag:" + flag); // 输出:true

4.String类转换方法

4.1字符串转数组

String split(String regex)

将一个字符串分割为子字符串,然后将结果作为字符串数组返回

char[] toCharArray()

将此字符串转换为新的字符数组。

byte[] getBytes()

得到一个操作系统默认的编码格式的字节数组

【示例】字符串转数组案例

String str = "I Love WHSXT";
// 字符串转数组,通过空格来做分割
String[] arr1 = str.split(" ");
// 输出:[I, Love, WHSXT]
System.out.println(Arrays.toString(arr1)); 
// 字符串转字符数组
char[] arr2 = str.toCharArray();
// 输出:[I,  , L, o, v, e,  , Y, o, u]
System.out.println(Arrays.toString(arr2)); 
// 字符串转字节数组
byte[] arr3 = str.getBytes();
// 输出:[73, 32, 76, 111, 118, 101, 32, 87, 72, 83, 88, 84]
System.out.println(Arrays.toString(arr3));

4.2字符串大小写转换

String toUpperCase()

返回一个新的字符串,该字符串中所有英文字符转换为大写字母。

String toLowerCase()

返回一个新的字符串,该字符串中所有英文字符转换为小写字母。

【示例】字符串转数组案例

String str = "hello world";
// 将字符串中字母全部转化为大写
String upperStr = str.toUpperCase();
System.out.println(upperStr); // 输出:"HELLO WORLD"
// 将字符串中字母全部转化为小写
String lowerStr = upperStr.toLowerCase();
System.out.println(lowerStr); // 输出:"hello world"

4.3忽略字符串前后空格

使用trim()方法去掉字符串中首尾的空格。

【示例】忽略字符串前后空格案例

String str = "   he llo  ";
// 忽略字符串前后空格
String newStr = str.trim();
// 输出:"--he llo--"
System.out.println("--" + newStr + "--");

4.4字符串截取

String substring(int beginIndex)

从beginIndex开始截取字符串,到字符串末尾结束。

String substring(int beginIndex, int endIndex)

从beginIndex开始截取字符串,到字符索引endIndex-1结束。

【示例】字符串截取案例

String str = "hello world";
// 从索引startIndex(包含)开始截取,一直截取到字符串末尾
String subStr1 = str.substring(3);
System.out.println(subStr1); // 输出:"lo world"
// 从索引startIndex(包含)开始截取,到endIndex(不包含)结束
String subStr2 = str.substring(3, 8);
System.out.println(subStr2); // 输出:"lo wo"

注意事项:

  1. 在substring(int beginIndex)方法中,如果 beginIndex的值为负或大于字符串长度,则抛出IndexOutOfBoundsException异常。
  2. 在substring(int beginIndex, int endIndex)方法中,如果beginIndex为负,或endIndex大于字符串长度,或beginIndex大于endIndex,则抛出IndexOutOfBoundsException异常。

4.5字符串替换

String replace(char oldChar, char newChar)

通过用newChar字符替换字符串中出现的所有oldChar字符,并返回替换后的新字符串。

String replace (CharSequence target, CharSequence replacement)

将与字面目标序列匹配的字符串的每个子字符串替换为指定的字面替换序列。

【示例】字符串替换案例

String str = "BJSXT and WHSXT";
// 替换字符串中的符合条件的字符
String newStr1 = str.replace('X', '学');
// 输出:"BJS学T and WHS学T"
System.out.println(newStr1); 
// 替换字符串中所有符合条件的子字符串
String newStr2 = str.replace("SXT", "尚学堂");
// 输出:"BJ尚学堂 and WH尚学堂"
System.out.println(newStr2);

4.6字符串拼接

String concat(String str)方法,将指定的字符串连接到该字符串的末尾,该方法实现的功能和“+”连接符比较相似。

【示例】字符串拼接案例

// 字符串拼接,功能和“+”连接符相似
String str = "hello".concat(" world");
// 输出:"hello world"
System.out.println(str);

5.String类其他方法

5.1isEmpty方法

boolean isEmpty()方法,判断字符串内容是否为空。当字符串长度为0,则返回true,否则返回false

【示例】判断字符串内容是否空案例

// 当字符串内容为空时,返回true
String str1 = "";
boolean flag1 = str1.isEmpty();
System.out.println(flag1); // 输出:true
// 当字符串内容为不为空时,返回false
String str2 = "hello world";
boolean flag2 = str1.isEmpty();
System.out.println(flag2); // 输出:true

5.2 equals方法

boolean equals (Object anObject)

判断字符串内容是否相同

boolean equalsIgnoreCas(String aotherString)

判断字符串内容是否相同,忽略字母大小写。

【示例】判断字符串内容是否相同案例

String str = "hello world";
// 判断字符串内容是否相同
boolean flag1 = str.equals("hello WORLD");
System.out.println(flag1); // 输出:false
// 判断字符串内容是否相同,忽略大小写
boolean flag2 = str.equalsIgnoreCase("hello WORLD");
System.out.println(flag2); // 输出:true

5.3 compareTo方法

int compareTo(String anotherString)方法按字典顺序比较两个字符串,返回参与比较的前后两个字符串的Unicode码的差值。

如果String对象按字典顺序排列在参数字符串之前,结果为负整数。如果String对象按字典顺序排列在参数字符串之后,结果为正整数。如果字符串相等,则结果为零。

【示例】compareTo方法使用

// 字符串相同,返回结果为0
int num1 = "abc".compareTo("abc");
System.out.println(num1);
// 字符串按字典顺序排列在参数字符串之前,结果为负整数
int num2 = "AB".compareTo("abc");
System.out.println(num2);
// 字符串按字典顺序排列在参数字符串之后,结果为正整数
int num3 = "abcd".compareTo("abc");
System.out.println(num3);

5.4 valueOf方法

valueOf方法是一个静态方法,可以把基本数据类型转化为字符串类型,是类型转换中非常重要的一个方法。

【示例】valueOf方法使用

// 把int类中转化为字符串
System.out.println(String.valueOf(123) + 4); // 输出:"1234"
// 把double类型转化为字符串
System.out.println(String.valueOf(1.23) + 4); // 输出:"1.234"
// 把boolean类型转化为字符串
System.out.println(String.valueOf(true) + 4); // 输出:"true4"
// 把char类型转化为字符串
System.out.println(String.valueOf('A') + 4); // 输出:"A4"

6.String类方法练习

1、获取指定字符串中,大写字母、小写字母、数字的个数。

public static void method(String str) {
	// 1.保存大写字母、小写字母和数字的个数
	int bigCount = 0, smallCount = 0, numberCount = 0;
	// 2.遍历出字符串中每一个字符,并对每一个字符进行判断
	for(int i = 0; i < str.length(); i++) {
		// 2.1获取到每个字符
		char c = str.charAt(i);
		// 2.2判断字符是否为大写字母
		if (c >= 'A' && c <= 'Z') {
			bigCount++;
		}
		// 2.3判断字符是否为小写字母
		else if (c >= 'a' && c <= 'z') {
			smallCount++;
		}
		// 2.4判断字符是否为数字
		else if (c >= '0' && c <= '9') {
			numberCount++;
		}
	}
	// 3.显示大写字母、小写字母、数字的个数
	System.out.println("大写字母个数:" + bigCount);
	System.out.println("小写字母个数:" + smallCount);
	System.out.println("数字个数:" + numberCount);	
}

2、判断字符串中指定某一个字符在字符串中出现的次数。

public static int method(String str, char c) {
	// 保存出现的次数
	int count = 0;
	// 循环查找字符,一直到字符串中不存在该字符为止
	while (str.indexOf(c) != -1) {
		// 获取查询到字符的索引位置
		int fromIndex = str.indexOf('a');
		// 截取字符串,下次查询从当前位置后开始查询
		str = str.substring(fromIndex + 1);
		// 次数递增
		count++;
	}
	return count;
}

3、 模拟trim()方法的实现,忽略字符串中前后的空格。

public static String method(String str) {
	// 开始索引和结束索引
	int start = 0, end = str.length() - 1;
	// 开始索引的空格
	while (start <= end && str.charAt(start) == ' ') {
		start++;
	}
	// 结束索引空格
	while (start <= end && str.charAt(end) == ' ') {
		end--;
	}
	// 截取字符串
	return str.substring(start, end);
}

4、判断两个字符串中最大相同子字符串,例如"hello-world"和"nballoaorc"中最大相同子串为"llo"。

public static String mothod(String str1, String str2) {
	// 1.判断两个字符串中最长和最短字符串
	boolean flag = str1.length() > str2.length();
	String maxStr = flag ? str1 : str2;
	String minStr = flag ? str2 : str1;
	// 2.遍历最小字符串,依次截取字符串内容
    int length = minStr.length(); 
	for (int x = 0; x < length; x++) {
		// a为开始位置,b为截止位置
		for (int a = 0, b = length - x; b <= length; a++, b++) {			
			// 2.1获取到截取的字符串内容
			String subStr = minStr.substring(a, b);
			// 2.2查看maxStr中是否包含该内容
			if (maxStr.contains(subStr)) {
				return subStr;
			}
		}
	}
	return "";
}