十二、字符串
1、API
1.1 API概述
API( Application Programming Interface):应用程序编程接口。
是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。
Java API:指的就是JDK中提供的各种功能的Java类。
这些类将底层的实现封装了起来,不需要关心这些类是如何实现的,
只需要学习这些类如何使用即可,可以通过帮助文档来学习这些API如何使用
1.2 API帮助文档
Java8 中文版API帮助文档:
https://www.matools.com/api/java8
2、String
2.1 String概述
String类在java.lang包下,所以使用的时候不需要导包
String类代表字符串,Java程序中的所有字符串文字(例如“abc“)都被实现为此类的实例
也就是说,Java程序中所有的双引号字符串,都是 String类的对象
字符串的特点
字符串不可变,它们的值在创建后不能被更改
虽然 String的值是不可变的,但是它们可以被共享
字符串效果上相当于字符数组(char[])但是底层原理是字节数组(byte[])
2.2 String构造方法
- public String():创建一个空白字符串对家,不含有任何内容
- public String(char[]chs):根据字符数组的内容,来创建字符串对象
- public String( byte[] bys):根据字节数组的内容,来创建字符串对象
- String s=“abc”; 直接赋值的方式创建字符串对家,内容就是abc
推荐使用直接赋值的方式得到字符串对象
package String;
public class StringDemo {
public static void main(String[] args) {
// public String():创建一个空白字符串对家,不含有任何内容
String s1 = new String();
System.out.println("s1:" + s1);
// public String(char[]chs):根据字符数组的内容,来创建字符串对象
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
System.out.println("s2:" + s2);
// public String( byte[] bys):根据字节数组的内容,来创建字符串对象
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println("s3:" + s3);
// String s="abc"; 直接赋值的方式创建字符串对家,内容就是abc
String s4 = "abc";
System.out.println("s4:" + s4);
}
}
s1:
s2:abc
s3:abc
s4:abc
2.3 String对象的特点
- 通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同
- 以“方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次, JVM都只会建立一个 String对象,并在字符串池中维护
2.4 字符串的比较
- 使用==做比较
基本类型:比较的是数据值是否相同
引用类型:比较的是地址值是否相同
- 字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫: equals()
public boolean equals( Object anobject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串
package String;
public class StringDemo {
public static void main(String[] args) {
//构造方法的方式得到对象
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
//直接赋值的方式得到对象
String s3 = "abc";
String s4 = "abc[";
//比较字符串对象地址是否相同
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s3 == s4);
System.out.println("--------");
//比较字符串内容是否相同
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s3.equals(s4));
}
}
false
false
false
--------
true
true
false
2.5 案例:用户登录
需求:已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示
思路:
①已知用户名和密码,定义两个字符串表示即可
②键盘录入要登录的用户名和空码,用 Scanner实现
③拿键盘录入的用户名、空码和已知的用户名、密码进行比较,给出相应的提示。字符串的内容比较,用 equals()方法实现
④用循环实现多次机会,这里的次数明确,采用for循环实现,并在登录成功的时候,使用 break结束循环
package String;
import java.util.Scanner;
public class StringDemo {
public static void main(String[] args) {
// 定义已知用户名和密码
String username = "root";
String userpassword = "123456";
// 用循环实现多次机会
for (int i = 0; i < 3; i++) {
// 键盘录入要登录的用户名和空码,用 Scanner实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
// 拿键盘录入的用户名、空码和已知的用户名、密码进行比较
if (name.equals(username) && pwd.equals(userpassword)) {
System.out.println("登陆成功");
break;
} else {
if (i == 2) {
System.out.println("账户已被锁定,五分钟后再试");
} else {
System.out.println("登录失败,你还有" + (2 - i) + "次机会");
}
}
}
}
}
2.6 案例:遍历字符串
需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
思路:
①键盘录入一个字符串,用 Scanner实现
②遍历字符串,首先要能够获取到字符串中的每一个字符
- public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
③遍历字符串,其次要能多获取到字符串的长度
- public int length0:返回此字符串的长度
- 数组的长度:数组名.length
- 字符串的长度:字符串对象.length()
④遍历字符串的通用格式
package String;
import java.util.Scanner;
public class StringDemo {
public static void main(String[] args) {
// 键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
// 遍历字符串,首先要能够获取到字符串中的每一个字符
// System.out.println(line.charAt(0));
// System.out.println(line.charAt(1));
// System.out.println(line.charAt(2));
//
// for (int i=0;i<3;i++){
// System.out.println(line.charAt(i));
// }
// 遍历字符串,其次要能多获取到字符串的长度
// System.out.println(line.length());
for (int i=0;i<line.length();i++){
System.out.println(line.charAt(i));
}
}
}
2.7 案例:统计字符次数
需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
思路:
①键盘录入一个字符串,用 Scanner实现
②要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
③遍历字符串,得到每一个字符
④判断该字符属于哪种类型,然后对应类型的充计变量+1
假如h是一个字符,我要判断它属于大写字母,小写字母,还是数字,直接判断字符是否在对应的范围即可 。大写字母:ch>=‘A’&&ch<=‘Z’
小写字母:ch>=‘a’&&ch<=‘z’
数字:ch>=‘0’&&ch<=‘9’
⑤输出三种类型的字符个数
package String;
import java.util.Scanner;
public class StringDemo {
public static void main(String[] args) {
// 键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
// 要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
// 遍历字符串,得到每一个字符
for (int i = 0;i < line.length();i++){
char ch = line.charAt(i);
// 判断该字符属于哪种类型,然后对应类型的充计变量+1
if (ch >= 'A' && ch <= 'Z'){
bigCount++;
}else if (ch >= 'a' && ch <= 'z'){
smallCount++;
}else if (ch >= '0' && ch <= '9'){
numberCount++;
}
}
System.out.println("大写字母的个数:" + bigCount);
System.out.println("小写字母的个数:" + smallCount);
System.out.println("数字的个数:" + numberCount);
}
}
2.8 案例:拼接字符串
需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法 并在控制台输出结果。例如,数组为 intl ar={1,2,3;,执行方法后的輸出结果为:[1,2,3]
思路:
①定义一个int类型的数组,用静态初始化完成数组元素的初始化
②定义一个方法,用于把int数组中的数据按照指定格式拼接成个字符串返回。返回值类型 String 参数列表 int[] arr
③在方法中遍历数组,按照要求进行拼接
④调用方法,用一个变量接收结果
⑤输出结果
package String;
public class StringDemo {
public static void main(String[] args) {
// 定义一个int类型的数组,用静态初始化完成数组元素的初始化
int[] arr = {11, 22, 33, 44, 55};
// 调用方法,用一个变量接收结果
String s = arrayToString(arr);
System.out.println(s);
}
// 定义一个方法,用于把int数组中的数据按照指定格式拼接成个字符串返回
public static String arrayToString(int[] arr) {
String s = "";
s += "[";
// 在方法中遍历数组,按照要求进行拼接
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
s += arr[i];
} else {
s += arr[i];
s += ", ";
}
}
s += "]";
return s;
}
}
[11, 22, 33, 44, 55]
2.9 案例:字符串反转
需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果 例如,键盘录入abc,輸出结果cba
思路
①键盘录入一个字符串,用Scanner实现
②定义一个方法,实现字符串反转。返回值类型 String,参数 String s
③在方法中把字符串倒着遍历,然后把每一个得到的字符拼接成一个字符申并返回
④调用方法,用一个变量接收结果
⑤输出结果
package String;
import java.util.Scanner;
public class StringDemo {
public static void main(String[] args) {
// 键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line= sc.nextLine();
// 调用方法,用一个变量接收结果
String sss=reverse(line);
System.out.println(sss);
}
// 定义一个方法,实现字符串反转。返回值类型 String,参数 String s
public static String reverse(String s){
String ss="";
// 在方法中把字符串倒着遍历,然后把每一个得到的字符拼接成一个字符申并返回
for (int i=s.length()-1;i>=0;i--){
ss+=s.charAt(i);
}
return ss;
}
}
3、StringBuilder
3.1 StringBuilder概述
如果对字符串进行拼接操作,每次拼妾,都会构建一个新的 String对象,既耗时,又浪费内存空间,而这种操 作还不可避免。那么我们可以通过java提供的StringBuilder类就来解决这个问题。
Stringbuilder是一个可变的字符串类,我们可以把它看成是一个容器
这里的可变指的是 Stringbuilder对象中的内容是可变的
String和 StringBuilder的区别:
- String:内容是不可变的
- StringBuilder:内容是可变的
3.2 StringBuilder构造方法
public StringBuilder:创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
package StringBuilder;
public class StringBuilderDemo {
public static void main(String[] args) {
// public StringBuilder 创建一个空白可变字符串对象,不含有任何内容
StringBuilder sb=new StringBuilder();
System.out.println("sb:"+sb);
System.out.println("sb.length():"+sb.length());
// public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象
StringBuilder sb2=new StringBuilder("hello");
System.out.println("sb2:"+sb2);
System.out.println("sb2.length():"+sb2.length());
}
}
sb:
sb.length():0
sb2:hello
sb2.length():5
3.3 StringBuilder的添加和反转方法
public StringBuilder append(任意类型):添加数据,并返回对象本身
public StringBuilder reverse():返回相反的字符序列
package StringBuilder;
public class StringBuilderDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// public StringBuilder append(任意类型):添加数据,并返回对象本身
// StringBuilder sb2 = sb.append("hello");
//
// System.out.println("sb:" + sb);
// System.out.println("sb2:" + sb2);
// System.out.println(sb == sb2);
// sb和sb2其实是同一个对象
// sb.append("hello");
// sb.append("world");
// sb.append("java");
// sb.append(999);
// 链式编程
sb.append("hello").append("world").append("java").append(999);
System.out.println("sb:" + sb);
// public StringBuilder reverse():返回相反的字符序列
sb.reverse();
System.out.println("sb:" + sb);
}
}
sb:helloworldjava999
sb:999avajdlrowolleh
3.4 StringBuilder和String相互转换
- StringBuilder转换为 String
public String tostring():通过 tostring()就可以实现把 StringBuilder 转换为 String
- String转换为StringBuilder
public String Builder(String s):通过构造方法就可以实现把 String转换为 StringBuilder
package StringBuilder;
public class StringBuilderDemo {
public static void main(String[] args) {
/*
// StringBuilder转换为 String
StringBuilder sb = new StringBuilder();
sb.append("hello");
// String s=sb; 这样的做法是错误的
String s = sb.toString();
System.out.println("s:" + s);
*/
// String转换为StringBuilder
String s = "hello";
// StringBuilder sb=s; 这样的做法是错误的
StringBuilder sb = new StringBuilder(s);
System.out.println("sb:" + sb);
}
}