String类
一、String构造方法
1.使用String的构造方法创建对象
java.lang是核心包.不用导包,所以String不用导包
String类作用: String类代表字符串。"“包裹的就是字符串,就是String对象"abc”, “aaa”
2.构造方法
1.String() 创建一个空字符串 “”
2.String(String original) 创建一个新的String对象,内容和参数一样的
3.String(char[] value) 将char数组转成字符串
4.String(byte[] bytes) 将byte数组转成字符串
最方便的是字符串直接赋值
String str5 = “Hello”;
代码示例:
public static void main(String[] args) {
// 创建对象的格式: 类名 对象名 = new 类名();
// 1.String() 创建一个空字符串 ""
String s1 = new String();
System.out.println("s1 = " + s1); // s1 = 空字符串""
// 2.String(String original) 创建一个新的String对象,内容和参数一样的
String s2 = new String("hello");
System.out.println("s2 = " + s2); // s2 = hello
// 3.String(char[] value) 将char数组转成字符串
char[] chs = new char[] {'a', 'b', 'c', 'd'};
String str3 = new String(chs); // "abcd"
System.out.println("str3 = " + str3); // str3 = abcd
// 4.String(byte[] bytes) 将byte数组转成字符串
byte[] buf = new byte[] {65, 66, 67, 68, 69};
String str4 = new String(buf); // 去ASCII码表中找对应的字符 {'A', 'B', 'C', 'D', 'E'}
System.out.println("str4 = " + str4); // str4 = ABCDE
// 以上构造方法使用的很少.最方便的是字符串直接赋值
String str5 = "Hello"; // 0x666
System.out.println("str5 = " + str5); // str5 = Hello
}
二、字符串直接赋值和newString
= =:
基本数据类型,比较数据的值是否相等
引用数据类型,比较对象的地址
" "包裹的字符串直接放在字符串常量池中,好处可以重复使用同一个对象.建议使用直接赋值
代码示例:
public class Demo01 {
public static void main(String[] args) {
System.out.println(3 == 3); // true
String s1 = "Hello"; // 直接赋值的字符串存在 字符串常量池中
String s2 = "Hello"; // 直接赋值的字符串存在 字符串常量池中
String s3 = new String("Hello"); // new的对象在堆中
String s4 = new String("Hello"); // new的对象在堆中
System.out.println("s1 == s2: " + (s1 == s2)); // true
System.out.println("s1 == s3: " + (s1 == s3)); // false
System.out.println("s3 == s4: " + (s3 == s4)); // false
}
}
三、 String的equals方法
1.equals 和 ==
== 比较对象的地址
equals方法可以比较字符串的内容
boolean equals(Object anObject) 比较字符串的内容是否相同
代码示例:
public class Demo021 {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = new String("Hello");
System.out.println(s1 == s2); // false
// equals:比较字符串内容 (网站登录比较用户和密码)
System.out.println(s1.equals(s2)); // true
}
}
2.equals 和 equalsIgnoreCase
equals:比较内容需要一模一样.大小写都要一样(区分大小写)
equalsIgnoreCase: 忽略大小写,大写和小写是一样的 (对比验证码)
3.equals方法的运用例子
要求:
已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示
分析:
1.已知用户名和密码使用变量保存起来
2.使用Scanner让用户输入账号密码
3.如果正确,提示登录成功,如果不正确提示登录失败
4.使用for循环输入三次,如果正确就跳出循环
代码:
public static void main(String[] args) {
// 1.已知用户名和密码使用变量保存起来
String userName = "abc";
String password = "123";
// 4.使用for循环输入三次,如果正确就跳出循环
for (int i = 0; i < 3; i++) {
// i = 0; 剩余2次
// i = 1; 剩余1次
// i = 2; 剩余0次
// 2.使用Scanner让用户输入账号密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入账号:");
String inputUserName = sc.next();
System.out.println("请输入密码:");
String inputPassword = sc.next();
// 3.如果正确,提示登录成功,如果不正确提示登录失败
if (userName.equals(inputUserName) && password.equals(inputPassword)) {
System.out.println("登录成功");
break;
} else {
System.out.println("登录失败,请重新输入, 剩余次数: " + (2 - i));
}
}
}
四、String的遍历案例
1.键盘录入一个字符串,使用程序实现在控制台遍历该字符串
效果:
用户输入:abcd
控制台一次打印每个字符:
a
b
c
d
分析:
核心从字符串中得到每个字符
char charAt(int index) 返回指定索引处的 char值
int length() 返回此字符串的长度。
代码:
public static void main(String[] args) {
// 0123
// String str = "abcd";
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next(); // abcd
// 遍历字符串获取每个字符
for (int i = 0; i < str.length(); i++) { // i = 0, 1, 2, 3
System.out.println(str.charAt(i));
}
// char charAt(int index) 返回指定索引处的 char值
// System.out.println(str.charAt(0)); // a
// System.out.println(str.charAt(1)); // b
// System.out.println(str.charAt(2)); // c
// System.out.println(str.charAt(3)); // d
// int length() 返回此字符串的长度。
// System.out.println(str.length()); // 4
}
2.统计字符次数案例:
需求:
键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
效果:
用户输入: RF2fd%#3SF&w2
控制台打印:
大写字母: 4
小写字母: 3
数字字符: 3
分析:
1.键盘录入一个字符串
2.定义3个计数器
3.遍历字符串得到每个字符
4.如果是大写字母,大写数量+1
5.如果是小写字母,小写数量+1
6.如果是数字字符,数字字符数量+1
代码:
public static void main(String[] args) {
// 1.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String str = sc.next(); // RF2fd%#3SF&w2
// ↑
// 2.定义3个计数器
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
// 3.遍历字符串得到每个字符
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 4.如果是大写字母,大写数量+1
if (c >= 'A' && c <= 'Z') {
bigCount++;
} else if (c >= 'a' && c <= 'z') {
// 5.如果是小写字母,小写数量+1
smallCount++;
} else if (c >= '0' && c <= '9') {
// 6.如果是数字字符,数字字符数量+1
numberCount++;
}
}
System.out.println("大写字母数量: " + bigCount);
System.out.println("小写字母数量: " + smallCount);
System.out.println("数字字符数量: " + numberCount);
}
3.遍历字符串案例
需求:
定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。
例如,数组为 int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]
分析:
拼接字符串 +就可以拼接字符串
1.定义一个数组
2.定义一个方法arrayToString
返回值类型: String字符串
参数列表: int[]数组
3.在方法内部
1.定义字符串"["
2.遍历数组
3.如果不是最后一个元素,拼接 "元素, "
4.如果是最后一个元素,拼接 "元素] "
5.返回拼接好的字符串
代码:
public static void main(String[] args) {
// 1.定义一个数组
int[] arr = {1, 2, 3};
String str = arrayToString(arr);
System.out.println("str = " + str);
}
// 0 1 2
// 2.定义一个方法arrayToString [1, 2, 3]
public static String arrayToString(int[] array) { // {1, 2, 3};
// 2.1.定义字符串"["
String str = "[";
// 2.2.遍历数组
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1) {
// 2.4.如果是最后一个元素,拼接 "元素] "
str += array[i] + "]";
} else {
// 2.3.如果不是最后一个元素,拼接 "元素, "
str += array[i] + ", ";
}
}
// 2.5.返回拼接好的字符串
return str;
}
4.字符串反转案例
需求:
定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
效果:
用户输入:abcd
控制台打印:
dcba
字符串的内容是不可变的
分析: 字符串内容是不可变的.需要搞一个新字符串 反过来遍历字符串,在重新拼接
1.让用户输入字符串
2.定义方法实现字符串反转reverse
返回值类型: 翻转后的字符串: String
参数列表: 用户输入的字符串: String str
3.在方法中反过来遍历字符串,拼接新字符串
小结:
字符串翻转案例,核心也是遍历字符串,反过来遍历字符串
将得到的每个字母拼接成新字符串
注意:长度问题
数组长度属性: 数组名.length
字符串长度方法: 字符串.length()
代码:
public static void main(String[] args) {
// 1.让用户输入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str2 = sc.next();
String reverseStr = reverse(str2);
System.out.println("翻转后的字符串 = " + reverseStr);
}
// 2.定义方法实现字符串反转reverse
public static String reverse(String str) {
String reverseStr = "";
// 3.在方法中反过来遍历字符串,拼接新字符串
//↓
// 0123
// abcd
for (int i = str.length() - 1; i >= 0 ; i--) {
char c = str.charAt(i);
reverseStr += c;
}
return reverseStr;
}
五.StringBuilder类
1.StringBuilder类的概述
字符串里面的内容不能改变
StringBuilder他里面的内容是可以改变的
StringBuilder:一个可变的字符序列
2.StringBuilder类的构造方法
-
StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符
-
StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器
3. StringBuilder类添加和反转方法
StringBuilder append(xxx x) 将指定类型添加到StringBuilder的末尾
StringBuilder reverse() 翻转StringBuilder中的内容
4.小结:
StringBuilder类的构造方法
1.StringBuilder() 创建空的StringBuilder.里面没有内容
2.StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器
StringBuilder类添加和反转方法
StringBuilder append(xxx x) 将指定类型添加到StringBuilder的末尾
StringBuilder reverse() 翻转StringBuilder中的内容
5.代码示例
public static void main(String[] args) {
// StringBuilder相当于一个容器.可以放各种数据
// StringBuilder类的构造方法
// 1.StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符
StringBuilder sb1 = new StringBuilder(); // 创建空的StringBuilder.里面没有内容
System.out.println("sb1 = " + sb1); // sb1 =
// 2.StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器
StringBuilder sb2 = new StringBuilder("hello"); // 创建一个有内容的StringBuilder
System.out.println("sb2 = " + sb2); // sb2 = hello
// 可以往StringBuilder中添加内容
// StringBuilder append(xxx x) 将指定类型添加到StringBuilder的末尾
sb1.append(true);
sb1.append(6.66);
sb1.append("大家好!");
sb1.append(111);
// StringBuilder特殊情况
StringBuilder sb3 = sb1.append("aa");
System.out.println(sb1 == sb3); // ==比较对象的地址 true
// append返回值就是调用者,他们是一样的
// 扩展:StringBuilder的特殊调用形式(链式调用)
sb1.append(11).append(true).append(3.33);
System.out.println("sb1 = " + sb1); // true6.66大家好!111
System.out.println("sb3 = " + sb3); // true6.66大家好!111
// StringBuilder reverse() 翻转StringBuilder中的内容
StringBuilder sb4 = new StringBuilder("abcd");
System.out.println(sb4.reverse()); // dcba
}
六.StringBuilder和String相互转换
String里面的内容不能变化
StringBuilder里面的内容可以变化,相当于加强版的String
所以有时候我们需要StringBuilder和String间的相互转换
1.String转换为StringBuilder
通过构造方法:
StringBuilder(String str)
2.StringBuilder转换为String
String toString() 将StringBuilder中的内容转成字符串返回
3.代码示例
public static void main(String[] args) {
// 1.String转换为StringBuilder
// StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器
String str = "hello";
StringBuilder sb = new StringBuilder(str);
// 2.StringBuilder转换为String
// StringBuilder类的方法 String toString() 返回表示此顺序中的数据的字符串。
String str2 = sb.toString();
System.out.println("str2 = " + str2);
}
七. StringBuilder案例
1.字符串拼接升级版案例
需求
定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。
例如,数组为 int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]
小结:
StringBuilder的append拼接字符串效率比String+拼接效率高一点
代码:
public static void main(String[] args) {
int[] arr = {1, 2, 3};
String str = arrayToString(arr);
System.out.println("str = " + str);
}
public static String arrayToString(int[] array) {
// 遍历数组,得到每个元素,拼接成字符串返回: [1, 2, 3]
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1) {
// 是最后一个元素
sb.append(array[i]).append("]");
} else {
// 不是最后一个元素
sb.append(array[i]).append(", ");
}
}
// 将StringBuilder中的内容转成字符串
return sb.toString();
}
2.字符串反转升级版案例
案例需求
定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
效果:
用户输入:abc
控制台打印:
cba
分析:以后看到字符串要翻转就想到StringBuilder类
1.用户输入一个字符串
2.将字符串转换成StringBuilder
3.使用StringBuilder的reverse翻转功能
4.将StringBuilder转成String
总结
String表示字符串,里面的内容不能改变
equals(): 比较字符串的内容是否相同
charAt(): 根据索引获取字符串中指定位置的字符 “abc”
length(): 获取字符串的长度
操作:字符串的遍历
for (int i = 0; i < str.length(); i++) {
// 取出每个字符
char c = str.charAt(i);
}
StringBuilder表示可变的字符串,里面的内容可以改变
构造方法:
StringBuilder() 创建一个StringBuilder里面没有内容
StringBuilder(String str) 创建一个StringBuilder里面的内容就是参数传入的内容
普通方法:
append(Xxx x) 添加数据到StringBuilder中
reverse() 翻转StringBuilder中的内容
toString() 将StringBuilder中的内容转成String