目录
3.4 StringBuilder 和 String 互相转换
3.5 通过帮助文档查看 StringBuilder 中的方法
思维导图
1 API
1.1 概述
API(Application Programming Intergace):应用程序编程接口
Java API:指的就是JDK中提供各种功能的Java类
这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用
1.2 如何使用帮助文档
① 右键打开该文档
② 找到索引选项卡中的输入框
③ 在输入框中输入Random(或者其他API)
④ 看类在哪个包下
⑤ 看类的描述
⑥ 看构造方法
⑦ 看成员方法
注意:调用方法的时候,如果方法有明确的返回值,我们用变量接受,可以手动完成,也可以使用快捷键的方式完成(Ctrl + Alt + V)
2 String
2.1 概述
String类在java.lang包下,所以使用的时候不需要导包
String类代表字符串,java程序中的所有字符串文字(例如“abc”)都被实现为此类的实例,也就是说,Java程序中所有的双引号字符串,都是String类的对象
字符串的特点
● 字符串不可变,它们的值在创建后不能被更改
● 虽然String的值是不可变的,但是它们可以被共享
● 字符串效果上相当于字符数组(char[ ]),但是底层原理是字节数组(byte[ ])
2.2 String类构造方法
public class StringDemo_01 {
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);
}
}
2.3 String 对象的特点
1)通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
char[] chs = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
上面代码中,JVM首先会创建一个字符数组,然后每一次 new 的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的
2)以 " " 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池中维护
String s3 = "abc";
String s4 = "abc";
上面代码中,针对第一行代码,JVM会建立一个String对象放在字符串池中,并给s3参考;第二行则让s4直接参考字符串池中的String对象,也就是说他们本质上市同一个对象
2.4 字符串的比较
使用 == 做比较
● 基本类型:比较的是数据值是否相同
● 引用类型:比较的是地址值是否相同
字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()
● public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串
public class StringDemo_02 {
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(s3 == s4);
System.out.println(s1 == s3);
System.out.println("-----------------------------");
//比较字符串内容是否相同
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s3.equals(s4));
}
}
案例:用户登录
需求:已知用户名和密码,请用程序实现模拟用户登录。总共三次机会,登录之后给出相应提示
import java.util.Scanner;
public class StringTest_01 {
public static void main(String[] args) {
//设置用户名和密码
String username = "zs";
String pwd = "123456";
//用户名和密码错误进行循环
for (int i = 0; i < 3; i++ ) {
//输入用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//将输入的用户名和密码与之前设置好的用户名和密码进行比较,相同则登录成功
if (name.equals(username) && password.equals(pwd)) {
System.out.println("登录成功!");
break;
} else {
if (i-2 == 0){
System.out.println("你的账号已被锁定,请联系管理员进行解锁。");
}else {
System.out.println("登录失败!你还有" + (2-i) + "次机会");
}
}
}
}
}
案例:遍历字符串
需求:键盘输入一个字符串,使用程序实现在控制台遍历该字符串
import java.util.Scanner;
public class StringTest_02 {
public static void main(String[] args) {
//输入一个字符串
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
//遍历
for (int i = 0; i < line.length(); i++) {
System.out.println(line.charAt(i));
}
}
}
案例:统计字符次数
需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
import java.util.Scanner;
public class StringTest_03 {
public static void main(String[] args) {
//输入一个字符串
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
//设置统计次数的初始值
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
//遍历和判断
for (int i = 0; i < line.length(); i++) {
//获取字符串的每个值
char c = line.charAt(i);
//判断
if(c >= 'A' && c <= 'Z'){
bigCount++;
}else if (c >= 'a' && c <= 'z' ) {
smallCount++;
}else if(c >= '0' && c <= '9'){
numberCount++;
}
}
//输出次数
System.out.println("大写字母字符出现的次数是:" + bigCount);
System.out.println("小写字母字符出现的次数是:" + smallCount);
System.out.println("数字字符出现的次数是:" + numberCount);
}
}
案例:拼接字符串
需求:定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如,数组为 int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]
public class StringTest_04 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {1, 2, 3};
//调用方法
String s = arrayToString(arr);
System.out.println(s);
}
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;
}
}
案例:字符串反转
需求:定义一个方法,实现字符串反转。键盘输入一个字符串,调用该方法后,在控制台输出结果例如:键盘录入abc,输出结果cba
import java.util.Scanner;
public class StringTest_05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入一个字符串:");
String line = sc.nextLine();
//调用方法
String s = reverse(line);
//输出结果
System.out.println(s);
}
public static String reverse(String s){
//初始化一个空字符串,用来存放反转的字符串
String ss = "";
//从最后一个开始遍历,并且将其拼接起来
for(int i = s.length()-1; i >= 0; i--){
ss += s.charAt(i);
}
//返回反转后的字符串
return ss;
}
}
2.5 通过帮助文档查看 String 中的方法
3 StringBuilder
3.1 概述
StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器
这里的可变是指StringBuilder对象中的内容是可变的
String 和 StringBuilder 的区别:
● String:内容是不可变的
● StringBuilder:内容是可变的
3.2 StringBuilder 构造方法
public class StringBuilder_01 {
public static void main(String[] args) {
//public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 | |
StringBuilder s1 = new StringBuilder();
System.out.println("s1:" + s1);
System.out.println("s1.length():" + s1.length());
//public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
StringBuilder s2 = new StringBuilder("hello");
System.out.println("s2:" + s2);
System.out.println("s2.length():" + s2.length());
}
}
3.3 StringBuilder 的添加和反转方法
public class StringBuider_02 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println("sb:" + sb);
//public StringBuilder append(任意类型) | 添加数据,并返回对象本身 | |
// StringBuilder sb2 = sb.append("hello");
// System.out.println("sb2:" + sb2);
// System.out.println("sb: " + sb);
// System.out.println(sb == sb2);
// sb.append("hello");
// sb.append("world");
// sb.append("java");
// sb.append(100);
// System.out.println("sb:" + sb);
//链式编程
sb.append("hello").append("word").append("java").append(100);
System.out.println("sb:" + sb);
//public StringBuilder reverse() | 返回相反的字符序列 |
sb.reverse();
System.out.println("sb:" + sb);
}
}
3.4 StringBuilder 和 String 互相转换
1 StringBuilder 转换成 String
public String toString():通过toString()就可以实现把 StringBuilder 转换成 String
2 String 转换成 StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把 String 转换成 StringBuider
public class StringBuilder_03 {
public static void main(String[] args) {
// StringBuilder sb = new StringBuilder();
// sb.append("hello");
// //1 StringBuilder 转换成 String
// //String s = sb; //这是错误的
// //public String toString():通过toString()就可以实现把 StringBuilder 转换成 String
// String s = sb.toString();
// System.out.println("s:" + s);
//2 String 转换成 StringBuilder
String s = "hello";
// StringBuilder sb = s; //这是错误的写法
//public StringBuilder(String s):通过构造方法就可以实现把 String 转换成 StringBuider
StringBuilder sb = new StringBuilder(s);
System.out.println("s:" + s);
}
}
运行结果:
案例:拼接字符串
需求:定义一个方法,把 int 数组中的数据按照指定格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如,数组为 int[ ] arr = {1,2,3};,执行方法后输出结果为:[1,2,3]
public class StringBuilder_04 {
public static void main(String[] args) {
int[] arr = {1,2,3};
String s = arryToString(arr);
System.out.println("s:" + s);
}
//定义一个方法,把 int 数组中的数据按照指定格式拼接成一个字符串返回,
public static String arryToString(int[] arr){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length-1){
sb.append(arr[i]);
}else{
sb.append(arr[i]).append(", ");
}
}
sb.append("]");
String s = sb.toString();
return s;
}
}
案例:字符串反转
需求:定义一个方法,实现字符串反转。键盘输入一个字符串,调用该方法后,在控制台输出结果
例如:键盘录入abc,输出结果cba
import java.util.Scanner;
public class StringBuilder_05 {
public static void main(String[] args) {
//输入一个字符串
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String r = myReverse(line);
System.out.println(r);
}
//定义一个方法,实现字符串反转
public static String myReverse(String s){
// StringBuilder sb = new StringBuilder(s);
// sb.reverse();
// String ss = sb.toString();
// return ss;
return new StringBuilder(s).reverse().toString();
}
}