JavaSE 基础 (7) String

API慨述-帮助文档的的使用

API概述

API(Application Programming Interface): 应用程序编程接口

编写程序去控制机器人踢足球,程序需要向机器人发出向前跑、向后跑、射门、抢球等各种命令。机器人厂商一定会提供一些用于控制机器人的接口类,这些类中定义好了操作机器人各种动作的方法。其实,这些接口类就是机器人 厂商提供给应用程序编程的接口,大家把这些类称为API


Java API: 指的就是 JDK 中提供的各种功能的 Java类

这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的, 只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些 API 如何使用


如何下载API文档

1.下载地址,点击进入:

http://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html

/images/java/JavaSE 基础 (7) String/1.png
(图1)

2.下载成功后,解压下载的压缩文件,点击进入 docs/api 下的 index.html 文件即可。

/images/java/JavaSE 基础 (7) String/2.png
(图2)

API文档如何阅读

/images/java/JavaSE 基础 (7) String/3.png
(图3)

eclipse 中将鼠标放到类或方法上,即可看到相关的注释说明:再按下 F2 即可将注释窗口固定。

/images/java/JavaSE 基础 (7) String/4.png
(图4)

IDEA 中需要设置才能看到相应说明。设置:File->Setting->Editor->General

/images/java/JavaSE 基础 (7) String/5.png
(图5)

键盘录入字符串

API使用练习

需求:按照帮助文档的使用步骤学习 Scanner 类的使用,并实现键盘录入一个字符串,最后输出在控制台

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import java.util.Scanner;

概念: Scanner是用来获取键盘录入的数据
构造:
	Scanner sc = new Scanner(System.in);
方法:
	int num = sc.nextInt();	//获取用户在控制台录入的数字
	String str = sc.next();	//获取用户在控制台录入的字符串, 结束标记: 空格、tab、换行符或其他分隔符, 也就是在遇到下一个词的开头时停止读取
	String str = sc.nextLine();	//获取用户在控制台录入的字符串, 结束标记: 回车换行符. 不建议使用(因为会和nextInt冲突)
	double d = sc.nextDouble();	//获取用户在控制台录入的小数
技巧

Scanner 的 nextInt() 方法会读取整数,然后留在输入流中的是回车符(换行符)。然而,Scanner 的 next() 方法不会读取换行符或其他空白字符。它只会读取下一个词,而词是由非空白字符组成的连续字符序列。因此,即使在输入流中存在上一个 nextInt() 方法留下的回车符,next() 方法也不会读取它,而是从输入流的下一个词开始读取。

String概述

String 类又称作不可变字符序列

String 类在 java.lang 包下,Java 程序默认导入 java.lang 包下的所有类,所以使用的时候不需要导包

Java 字符串就是 Unicode 字符序列,例如字符串 “Java” 就是 4 个 Unicode 字符 “J” “a” “v” “a” 组成的


Java 没有内置的字符串类型,而是在标准 Java 类库中提供了一个预定义的类 String,每个用双引号括起来的字符串都是 String 类的一个实例,也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象

字符串不可变,它们的值在创建后不能被更改

1
2
3
4
5
6
7
8
public static void main(String[] args){
	String s1 = "abc123";
	int length = s1.length();
	System.out.println(length);
	
	s1 = "def"; //这一步是让s1这个字符串类型的变量,记录了一个新的对象。
	System.out.println(s1);
}

String类常见构造方法

方法名 说明
public String() 创建一个空白字符串对象,不含有任何内容
public String(char[] chs) 根据字符数组的内容,来创建字符串对象
public String(char[] chs) 根据字符数组的内容,来创建字符串对象
String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc

String 这个类比较特殊,打印其对象名的时候, 不会出现内存地址, 而是该对象所记录的真实内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public static void main(String[] args){
	//public String():创建一个空白字符串对象,不含有任何内容
	String s1 = new String();
	System.out.println(s1);

	//public String(char[] chs):根据字符数组的内容,来创建字符串对象
	char[] chs = {'a','b','c'};
	String s2 = new String(chs);

	System.out.println(s2);  //abc

	//public String(String original): 根据传入的字符串内容,来创建字符串对象
	String s3 = new String("123");
	System.out.println(s3);  //123
}

创建字符串对象的区别对比

  • 问题:构造方法能创建对象,双引号也能创建字符串对象,有什么区别吗?
  • 注意:== 号做比较

基本数据类型:比较的是具体的值

1
2
3
int a = 10;
int b = 20;
System.out.println(a == b); //false

引用数据类型:比较地址值

1
2
3
Student s1 = new Student(23);
Student s2 = s1;
System.out.println(s1 == s2); //true

问题:下列代码的运行结果是?

1
2
3
4
5
6
7
8
9
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);   //true

char[] chs = {'a','b','c'};
String s3 = new String(chs);
String s4 = new String(chs);

System.out.println(s3 == s4);  //false
结论

双引号创建的字符串对象,在字符串常量池中存储,通过构造方法创建的字符串对象,在堆内存中存储


" " 方式给出的字符串,只要字符序列相同 (顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串常量池中维护

1
2
String s1 = "abc";
String s2 = "abc";

字符串常量池:当使用 双引号创建字符串对象的时候,系统会 检查该字符串是否在字符串常量池中存在

  • 不存在:创建
  • 存在:不会重新创建,而是直接复用
/images/java/JavaSE 基础 (7) String/6.png
(图6)

注意:字符串常量池在 JDK 7 版本开始, 从方法区中挪到了堆内存


通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同

1
2
3
4
char[] = chs {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
System.out.println(s1 == s2);  //false

上面的代码中,JVM 会首先创建一个字符数组,然后每一次 new 的时候都会有一个新的地址

/images/java/JavaSE 基础 (7) String/7.png
(图7)

String特点

String 字符串的特点

  • Java 程序中所有的双引号字符串,都是 String 类的对象
  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然 String 的值是不可变的,但是它们可以被共享 (字符串常量池的特点)

/images/java/JavaSE 基础 (7) String/8.png
(图8)

一般我们比较字符串,比较的都是值是不是相等,用 System.out.println(str1.equals(str2)); 字符串对象里包含的字符是不是一样的,对象不一样没关系,我们只要内容一样就行


变量拼接

1
2
3
4
5
6
7
8
public class Test{
	public static void main(string[] args){
		String s1 = "abc";
		String s2 = "ab";
		String s3 = s2 + "c";  //变量跟 + 号作拼接
		System.out.println(s1 == s3);  //false
	}
}

当字符串之间使用 + 号串联(拼接)的时候,系统底层会自动创建一个 StringBuilder 对象
然后再调用其 append 方法完成拼接
拼接后,再调用其 toString 方法转换为 String 类型

/images/java/JavaSE 基础 (7) String/9.png
(图9)

常量拼接

1
2
3
4
5
6
7
public class Test{
	public static void main(String[] args){
		String s1 = "abc";
		String s2 = "a" + "b" + "c";
		System.out.println(s1 == s2);  //true
	}
}

Java 存在常量优化机制,在编译的时候,就会将 “a”+“b”+“c” 拼接为 “abc”, 然后 s1、s2 都会指向常量池中的内存地址


字符串连接

1
2
3
String s1 = "Hello";
String s2 = "World!"
String s = s1  + s2;  //HelloWorld!

符号 "+" 把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式

"+" 运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接

1
2
3
4
int age = 18;
String str = "age is" + age; //str赋值为"age is18"
//这种特性通常被用在输出语句中
System.outprintln("age is" + age);

String类和常量池

全局字符串常量池(String Pool)

全局字符串常量池中存放的内容是在类加载完成后存到 String Pool 中的,在每个 JVM 中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例), 也就是放一堆常量在里边

class文件常量池(Class Constant Pool)

class 常量池是在编译的时候每个 class 都有的,在编译阶段,存放的是常量(文本字符串、final 常量等)和符号引用。

运行时常量池(Runtime Constant Pool)

运行时常量池是在类加载完成之后,将每个 class 常量池中的符号引用值转存到运行时常量池中,也就是说,每个 class 都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。


1
2
3
4
5
6
7
8
9
// 字符串相等判断 (以后一般判断字符串值是否相等,使用equals()

String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
System.out.println(str1 == str3); //true
System.out.println(str2 == str3); //false

System.out.println(str2.equals(str3)); //true

String类常用的方法

String类的常用方法列表

名称 说明
char charAt(int index) 返回字符串中第 index 个字符
boolean equals(String other) 如果字符串与 other 相等,返回 true; 否则,返回 false。
boolean equalslgnoreCase(String other) 如果字符串与 other 相等(忽略大小写),则返回 true; 否则,返回 false。
int indexOf(String str) 返回从头开始查找第一个子字符串 Str 在字符串中的索引位置。如果未找到子字符串 str,则返回 -1。
lastIndexOf(String str) 返回从未尾开始查找第一个子字符串 str 在字符串中的索引位置。如果未找到子字符串 str,则返回 -1。
int length( ) 返回字符串的长度。
String replace(char oldChar,char newChar) 返回一个新串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。
boolean startsWith(String prefix) 如果字符串以 prefix 开始,则返回 true。
boolean endsWith(String prefix) 如果字符串以 prefix 结尾,则返回 true。
String substring(int beginlndex) 返回一个新字符串,该串包含从原始字符串 beginlndex 到串尾。
String substring(int beginlndex,int endIndex) 返回一个新字符串,该串包含从原始字符串 beginIndex 到串尾或 endIndex-1 的所有字符。
String toLowerCase( ) 返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母。
String toUpperCase( ) 返回一个新字符串,该串将原始字符串中的所有小写字母改成大写字母。
String trim( ) 返回一个新字符串,该串删除了原始字符串头部和尾部的空格。
String[ ] split(string str) 把字符串按照指定的规则 “str”,进行切分,返回被切分后的所有字符串
char[ ] tocharArray( ) 将字符串拆分为字符数组

演示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
String str1 = new String("abcdefg");
String str2 = "abcdefg";
String str3 = "abcdEFG";
String str4 = "def";

//charAt : 返回字符串中第0个字符
System.out.println(str2.charAt(0));  //a
System.out.println(str2.charAt(str2.length() - 1));  //g 通常用此方法取最后一个字符

//equals : 判断2个字符串的值是不是相等
System.out.println(str1.equals(str2));  //true
System.out.println(str1.equals(str3));  //false

//equalsIgnoreCase : 忽略大小写判断2个字符串的值是不是相等
System.out.println(str2.equalsIgnoreCase(str3));  //true

//indexOf : 从开头到结尾查找,返回找到的第一个子字符串的索引位置,如未找到,返回-1
System.out.println(str2.indexOf(str4));  //3
System.out.println("abcdefgdefg".indexOf(def));  //3
System.out.println("abcdefgdefg".indexOf(DEF));   //-1

//lastindexOf : 从末尾开始查找
System.out.println("abcdefgdefg".lastindexOf(def));  //7

//length : 输出字符串长度
System.out.println(str2.length());  //7

//replace : 字符串的替换
System.out.println("abcdefgdefg".replace("defg","abc"));  //abcabcabc  这个不用对应,因为是字符串
System.out.println("abcdcd".replace("d","D")) ;  //abcDcD  这个要对应,一个字符替换一个字符

//startsWith / endsWith
System.out.println("abcdfg".startsWith("ab"));   //true
System.out.println("abcdfg".endsWith("dfg"));   //true

//substring : 截取子字符串
System.out.println("abcdefg".substring(3));     //defg
System.out.println("abcdefg".substring(2,4));    //cd

//toLowerCase / toUpperCase
System.out.println("abcdEFG".toLowerCase());   //abcdefg  大写改小写
System.out.println("abcdefg".toUpperCase());     //ABCDEFG  小写改大写

//trim
System.out.println("  a b  ".trim());   //原来长度6, trim()之后, a b长度3, 去开头和结尾空格, 中间的空格没去除
System.out.println(" a b ".replace(" ",""));   //ab   将空格替换为空字符串

//Split
String[] fileNameArr = fileName.split("\\.");
/*
	Split( )里放的是正则表达式, 正则表达式里的 "." 代表的是任意字符, 所以需要 "\" 来转义, 然后再加一个 "\" 表示 "\" 是个普通的"\"
	正则表达式里用\\
	普通的用\
*/

//tocharArray()
public static void main(String[] args){
	//1.键盈录入一个字符串,用Scanner实现
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入:");
	String s = sc.nextLine();
	//2.将字符串拆分为字符数组
	char[] chars = s.toCharArray();
	//3.遍历字符数组
	for (int i=0;i<chars.length;i++){
		System.out.println(chars[i]);
	}
}

String 是不可变字符序列,所有的替换,截取子字符串,去空格,转换大小写等都是生成了新字符串,老的字符串不变

案例:用户登录

需求:已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args){
	//1.已知用户名和密码,定义两个字符串表示即可
	String username = "admin";
	String password = "123456";
	
	//2.键盘录入要登录的用户名和密码,用Scanner实现
	Scanner sc = new Scanner(System.in);
	for(int i =1; i<=3; i++){  //3次机会 
		System.out.println("请输入用户名:");
		String scUsername = sc.nextLine();
		System.out.println("请输入密码:");
		String scPassword = sc.nextLine();

		//3.拿键盘录入的用户名、密码和已知的用户名、密码进行比较,给出相应的提示。
		if(username.equals(scUsername) && password.equals(scPassword)){
			System.out.println("登录成功");
			break;
		}else{
			if(i== 3){
				System.out.println("您的登录次数已达到今日上限,请明天再来")
			}else{
				System.out.println("登录失败,您还剩余" + (3-i) + "次机会")
			}
		}
	}
}

案例:遍历字符串

需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public static void main(String[] args){
	//1.键盘录入一个字符串,用Scanner实现
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入:");
	String s = sc.nextLine();
	
	//2.将字符串拆分为字符数组
	char[] chars = s.toCharArray();
	
	//3.遍历字符数组
	for (int i=0; i<chars.length; i++){
		System.out.println(chars[i]);
	}
}

案例:统计字符次数

需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数 (不考虑其他字符)

  • 大写字母:ch>=‘A’ && ch<=‘Z
  • 小写字母:ch>=‘a’ && ch<=‘z
  • 数字:ch>=‘0’ && ch<=‘9

把字符转换成数值之后, 再进行判断

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 public static void main(String[] args){
	//1.键盘录入一个字符串,用Scanner实现
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入:");
	String s = sc.nextLine();

	//2.要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
	int bigCount = 0;
	int smallCount = 0;
	int numCount = 0;
	
	//3.遍历字符串,得到每一个字符
	char[] chars = s.toCharArray();
	for (int i=0;i<chars.length;i++){
		char c = chars[i];
		//4.判断该字符属于哪种类型,然后对应类型的统计变量+1
		if(c>='A'&& c<='Z'){
			bigCount++;
		}e1seif(c>='a' && c<='z'){
			smallCount++;
		}e1seif(c>='0' && c<='9'){
			numCount++
		}
	}
	
	//5.输出三种类型的字符个数
	System.out.println("大写字母字符:" + bigCount);
	System.out.println("小写字母字符:" + samllCount);
	System.out.println("数字字母字符:" + numCount);

}

手机号屏蔽(字符串截取)

需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽

最终效果为:156****1234

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public static void main(String[] args){
	//1.键盘录入一个字符串,用Scanner实列
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入手机号:");
	String telString = sc.nextLine();
	
	//2.截取字符串前三位
	String start telstring.substring(0,3);
	
	//3.截取字符串后四位
	String end telstring.substring(7);
	
	//4.将截取后的两个字符串,中间加上****进行拼接,输出结果
	System.out.println(start + "****" + end);
}

敏感词替换(字符串替换)

需求:键盘录入一个字符串,如果字符串中包含(TMD), 则使用***替换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public static void main(String[] args){
	//1.键盘录入一个字符串,用Scanner实现
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入:");

	String s = sc.nextLine();
	//2.替换敏感词
	String result = s.replace("TMD", "***")
	//3.输出结果
	System.out.println(result);
}

切割字符串

需求:以字符串的形式从键盘录入学生信息,例如:“张三,23” 从该字符串中切割出有效数据, 封装为 Student 学生对象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public static void main(String[] args){
	//2.键盘录入一个字符串,用Scanner实现
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入学生信息:");
	String stuInfo = sc.nextLine();
	
	//stuInfo="张三,23";
	//3.根据逗号切割字符串,得到(张三)(23)
	String[] sArr = stuInfo.split(",")
	//System.out.println(sArr[0]);
	//System.out.println(sArr[1]);

	//4.从得到的字符串数组中取出元素内容,通过Student类的有参构造方法封装为对象
	Student stu = new Student(sArr[0],sArr[1]);
	//5.调用对象getXxx.方法,取出数据并打印。
	System.out.println(stu.getName() + "..." + stu.getAge());
}

StringBuilder概述

StringBuilder: 是一个 可变的字符串 类,我们可以把它看成是一个容器

作用:提高字符串的操作效率

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
概述: StringBulider就是字符串编译器,专门用来做字符串拼接.
构造: 
    public StringBuilder();				//创建一个空的容器
	public StringBuilder(String str);	//创建一个里边已经存储了str字符串的容器
方法:
	public StringBulider append(任意类型);	//在容器中追加数据
    public StringBulider reverse();		   //对容器中的内容进行翻转
    public int length();		   		   //计算容器中字符的长度
    public String toString();		   	   //把StringBuilder转换为String
转换:
	//String -> StringBulider
	StringBuilder sb = new StringBuilder(str字符串);
    //StringBulider -> String
    String str = sb对象.toString();

StringBuilder的构造方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public static void main(String[] args){

	//public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
	StringBuilder sb = new StringBuilder();
	System.out.println(sb);

	//public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
	StringBuilder sb2 = new StringBuilder("abc");
	System.out.println(sb2);  //abc
}

打印 String 对象和 StringBuilder 对象都会出现元素内容, 而不会出现内存地址

StringBuilder常用的成员方法

  • public StringBuilder append(任意类型):添加数据,并返回对象本身
  • public StringBuilder reverse( ): 返回相反的字符序列
  • public int length( ): 返回长度(字符出现的个数)
  • public String toString( ): 通过 toString( ) 就可以实现把 StringBuilder 转换为 String

StringBuilder 可以添加任意类型的数据, 但是这些数据进入到容器后, 他们就变成了字符串数据了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public static void main(String[] args){
	StringBuilder sb = new StringBuilder();
	sb.append(123);
	sb.append("abc");
	sb.append(true);
	System.out.println(sb); //1223abctrue
	
	sb.append("\n");
	sb.append(456);
	/**
		1223abctrue
		456
	*/
	System.out.println(sb);
}

链式编程:如果一个方法返回的是对象类型,对象就可以继续向下调用方法

sb.append(“红色”).append(“蓝色”).append(“绿色”);

StringBuilder不常用的成员方法

appendCodePoint(int):将输入的数字转为 unicode 字符

1
2
3
4
StringBuilder sb = new StringBuilder();
sb.append("我").appendCodePoint(97);
System.out.println(sb);//我a
System.out.println(Character.toChars(97));//a

setCharAt(int i, char c):将第 i 个元素设置为 c(可以理解为替换)

1
2
3
4
StringBuilder sb = new StringBuilder();
sb.append("我abc123");
sb.setCharAt(0,'a');
System.out.println(sb);//aabc123

insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)

1
2
3
4
StringBuilder sb = new StringBuilder();
sb.append("我abc123");
sb.insert(3,"你");
System.out.println(sb);//我ab你c123

delete(int startIndex,int endIndex):删除起始位置(含)到结尾位置(不含)之间的字符串

1
2
3
4
StringBuilder sb = new StringBuilder();
sb.append("我abc123");
sb.delete(2, 5);
System.out.println(sb);//我a23

String Builder提高效率原理

String 原理图

/images/java/JavaSE 基础 (7) String/10.png
(图10)

一个加号,堆内存中俩对象

String s2 = s1 + "b"; 堆中创建了 001002 对象, 只要你使用 + 号拼接, 堆中会自动创建一个 StringBuilder 对象, 拼完以后调用 toString 方法


String Builder 提高效率原理图

/images/java/JavaSE 基础 (7) String/11.png
(图11)

也就是说如果使用 StringBuilder 对象做拼接的话, 及时进行 10 万次的字符串拼接, 堆内存中也只有一个 StringBuilder 对象, 这就是他提高效率的原理


String Builder 和 String 的区别

  • String: 内容是不可变的
  • StringBuilder: 内容是可变的

对称字符串案例(String和StringBuilder之间的转换)

需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是

对称字符串:123321、111

非对称字符串:123123

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args){
	//1.键盘录入一个字符串,用Scanner实现
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入对称字符串:");
	String s = sc.nextLine();

	//2.将键盘录入的字符串反转
	//将字符串封装为StringBuilder对象,目的是为了掉用其反转的方法
	StringBuilder sb = new StringBuilder(s);
	sb.reverse();
	String reverseStr = sb.toString();
	//s:String
	//sb:StringBuilder

	//3.使用反转后的字符串,和原字符串进行比对
	if(s.equals(reverseStr)){
		System.out.println("是对称字符串");
	}else{
		System.out.println("不是对称字符串");
	}
}

String Builder 和 String 相互转化

1.StringBuilder 转换为 String

public String toString( ): 通过 toString( ) 就可以实现把 StringBuilder 转换为 String

2.String 转换为 String Builder

public StringBuilder(String s): 通过构造方法就可以实现把 String 转换为 StringBuilder

StringBuilder拼接字符串案例

需求:定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如,数组为int[ ] arr = {1, 2, 3};, 执行方法后的输出结果为:[1,2,3]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args){
	//1.定义一个int类型的数组,用静态初始化完成数组元素的初始化
	int[] arr = {1,2,3};
	String s = arrayToString(arr);  //arrayToString()是下面自定义的方法
	System.out.println(s);
}

//2.定义一个方法,返回值类型String, 参数列表int[] arr
public static String arrayToString(int[] arr){
	//3.在方法中用StringBuilder按照要求进行拼接,并把结果转成String返回
	StringBuilder sb = new StringBuilder("[");
	for (int i=0;i<arr.length;i++){
		if(i == arr.length -1){
			sb.append(arr[i]).append("]");
		}else{
			sb.append(arr[i]).append(",")
		}
	return sb.toString();
}

0%