第十章_String and StringBuilder的使用和区别
1. String类
1.1 String概述
- String类在java.lang包下,使用的时候不需要导包
- String类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象
- 字符串不可变,它们的值在创建后不能被更改
1.2 String类的构造方法
常用构造方法
方法名 | 说明 |
---|---|
public String() | 创建一个空白的字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(String original) | 根据传入的字符串内容,来创建字符串对象 |
String s= “abc”;(特殊) | 直接复制的方式创建字符串对象,内容就是abc |
代码演示:
public class Test {
public static void main(String[] args) {
/*
注意:
String这个类比较特殊, 打印其对象名的时候, 不会出现内存地址
而是该对象所记录的真实内容.
面向对象-继承, Object类
*/
// String类常见构造方法:
// public String() : 创建一个空白字符串对象,不含有任何内容
System.out.println("------------------");
String s1 = new String();
System.out.println(s1);
System.out.println("-------------");
// public String(char[] chs) : 根据字符数组的内容,来创建字符串对象
char[] chars = {'a','b','c','c'};
String s2 = new String(chars);
System.out.println(s2);
System.out.println("-------------");
// public String(String original) : 根据传入的字符串内容,来创建字符串对象
String s3 = new String("eeeeeee");
System.out.println(s3);
System.out.println("-------------");
// String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
String s4 = "快乐的E";
System.out.println(s4);
}
}
执行效果:
1.3字符串对象的区别对别
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以“ ”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
代码演示:
public class Test {
public static void main(String[] args) {
String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2);//false
System.out.println("-----------------------");
String s3 = "abc";
String s4 = "abc";
System.out.println(s3 == s4);//true
}
}
执行效果:
1.4字符串的比较
- == 比较基本数据类型:比较的是具体的值
- == 比较引用数据类型:比较的是对象地址值
String类 : public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写
public boolean equalsIgnoreCase(String s) 比较两个字符串内容是否相同、不区分大小写
代码演示:
public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ABC";
String s3 = "abc";
// equals : 比较字符串内容, 区分大小写
System.out.println(s1.equals(s2));//false
System.out.println(s1.equals(s3));//true
System.out.println("---------------");
// equalsIgnoreCase : 比较字符串内容, 忽略大小写
System.out.println(s1.equalsIgnoreCase(s2));//true
System.out.println(s1.equalsIgnoreCase(s3));//true
}
}
执行效果:
1.5 字符串的遍历
案例需求 :
键盘录入一个字符串,使用程序实现在控制台遍历该字符串
实现方式1
实现步骤 :
- 键盘录入一个字符串,用 Scanner 实现
- 遍历字符串,首先要能够获取到字符串中的每一个字符, public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
- 遍历字符串,其次要能够获取到字符串的长度, public int length():返回此字符串的长度
- 遍历打印
遍历字符串,首先要能够获取到字符串中的每一个字符
public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
代码演示:
/*
需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
思路:
1. 键盘录入一个字符串,用 Scanner 实现
2. 遍历字符串,首先要能够获取到字符串中的每一个字符
public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
3. 遍历字符串,其次要能够获取到字符串的长度
public int length():返回此字符串的长度
4. 遍历打印
9
*/
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
// 2. 遍历字符串,首先要能够获取到字符串中的每一个字符
for(int i = 0; i < s.length(); i++){
// i : 字符串的每一个索引
char c = s.charAt(i);
System.out.println(c);
}
}
执行效果:
实现方式2
实现步骤 :
- 键盘录入一个字符串,用 Scanner 实现
- 将字符串拆分为字符数组 , public char[] toCharArray( ):将当前字符串拆分为字符数组并返回
- 遍历字符数
代码演示:
public class Test {
/*
需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
思路:
1. 键盘录入一个字符串,用 Scanner 实现
2. 将字符串拆分为字符数组
public char[] toCharArray( ):将当前字符串拆分为字符数组并返回
3. 遍历字符数组
*/
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]);
}
}
}
执行效果:
1.6 字符串中的常用方法
方法名 | 功能 |
---|---|
substring | 截取字符串: 传入一个参数:从当前索引开始到最后 传入两个参数:截取一段字符串(是一个前闭后开的区间,含头不含尾) |
replace | 替换字符串: 传入第一个参数是要被替换的内容 传入第二个参数是替换后的内容 |
split | 切割字符串: 需要符合正则表达式的规则,特殊字符需要转义 |
concat | 将指定的字符串连接到字符串的末尾 |
charAt | 返回指定索引处的char值 |
toCharArray | 把字符串转为一个数组 |
indexOf | 获取某个字符在字符串中第一次出现的索引 |
length | 获取字符串的长度 |
contains | 判断字符串中是否含有指定的内容 |
equals | 判断字符串内容是否相同 |
equalsIgnoreCase | 判断字符串内容是否相同(忽略大小写) |
startwith | 判断是否以指定的内容开头 |
endwith | 判断是否以指定的内容结尾 |
getBytes | 将指定字符串转成byte数组 |
toLowerCase | 把字符串中的字母全部转为小写 |
toUpperCase | 把字符串中的字母全部转为大写 |
trim | 去掉字符串两端的空格 |
2. StringBuilder类
2.1 StringBuilder概述
StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的。
2.2 StringBuilder类的构造方法
常用的构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
代码演示:
public class Test {
public static void main(String[] args) {
System.out.println("-----------------------");
StringBuilder sb = new StringBuilder();//是一个空行
System.out.println(sb);
System.out.println("------------------");
StringBuilder sb2 = new StringBuilder("abc");//有参构造
System.out.println(sb2);
}
}
执行效果:
2.3 StringBuilder和String的区别
- String的内容在对象创建之后是不可变的,在拼接字符串时,每次都会new一个新的对象去拼接
- StringBuilder的内容是可以改变的,直接在该对象后面拼接
String和StringBuilder的图解
代码演示:
创建两个方法,分别对String和StringBuilder进行5w次的字符串拼接
public class Test {
public static void main(String[] args) {
stringTime();
stringBuilderTime();
}
private static void stringBuilderTime() {
//获取当前系统的时间。从1970年1月1日 0点开始 单位是毫秒值
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 50000; i++) {
sb.append(i);
}
// System.out.println(s);
long end = System.currentTimeMillis();
System.out.println("使用StringBuilder拼接字符串使用的时间:"+(end-start));
}
private static void stringTime() {
//获取当前系统的时间。从1970年1月1日 0点开始 单位是毫秒值
long start = System.currentTimeMillis();
String s = "";
for (int i = 0; i < 50000; i++) {
s+=i;
}
// System.out.println(s);
long end = System.currentTimeMillis();
System.out.println("使用String拼接字符串使用的时间:"+(end-start));
}
}
执行效果:
2.4 StringBuilder常用的成员方法
添加和反转方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
public String toString() | 把StringBuilder对象转化为String类型 |
代码演示:
public class Test {
public static void main(String[] args) {
// StringBuilder拼接不限定类型
StringBuilder sb = new StringBuilder();
sb.append(15);
sb.append("afg");
sb.append(true);
System.out.println("反转前:"+sb);
//字符串反转
sb.reverse();
System.out.println("反转后:"+sb);
System.out.println("长度:"+sb.length());
//把StringBuilder对象转化为String对象
String s = sb.toString();
System.out.println(s);
}
}
执行效果:
总结
- String的长度不可变
- StringBuilder的长度可变
- 拼接字符串时使用StringBuilder的效率更高