字符串
API
- API:应用程序编程接口
- Java API:JDK中提供的各种功能的Java类
- 打开
- 点击显示
- 页签搜索
- 看在哪个包
- 看描述
- 看构造方法
- 看成员方法
键盘录入字符串
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
System.out.println(s);
-
next():遇到空格,tab就不在录入,结束标记:空格,tab
-
nextLine(): 可以将数据完全录入,结束标记:空格换行
-
nextInt和nextLine不能一起使用
String
- 核心类库,不用导包
- 只要 “” 就是字符串
- 创建后无法更改(只换内存地址)
String 常见的构造方法
- public String() 创建一个空白的字符串对象,不含有任何内容
- public String(char[] chs):根据字符数组的内容,来创建字符串对象
- public Sring(String original):更具传入的字符内容,来创建字符串的对象
- String s = “abc”; :直接赋值的方式创建字符串对象,内容就是abc
Ps:String这个类比较特殊,打印其对象吗的时候,不会出现内存地址而是该对象所记录的真是内容
创建字符串对象的区别对比
- ==作比较
基本数据类型:比较具体的值
应用数据类型:比较地址值
- 以 “” 方式创建的,只要顺序和大小写相同,无论出现几次,JVM都只会建立一个String对象,并在字符串常量池中维护
字符串常量池: 不存在:创建,存在,不会重新创建建,而是直接复用
-
通过new创建的字符串对象,每一次nuw都会申请一个内存空间,虽然内容相同,但地址不同
-
双引号创建的字符串对象,在字符串常量池中存储,通过构造方法创建的的字符串对象,在对内存中存储
String特点
- Java程序中所有的双引号字符串,都是String类的对象
- 字符串不可变,他们的值在创建后不能被改变
- 虽然String的值是不可变的,但是他们可以被共享
String s1 = "abc"
String s2 = "ab"
String s3 = s2 + "c"
System.out,println(S1 == S2);
结果为false
当字符串直接使用 + 号连接的时候,系统底层会自动创建一个StringBuider对象,然后再调用其append方法完成凭借,拼接后,再调用toString方法转换为String类型
String s1 = "abc";
String s2 = "a" + "b" + "c";
System.out.println(s1 == s2);
结果为true
Java 存在常量优化机制"a" + “b” + “c"拼接成"abc”
字符串的比较
equals()方法比较
- 将此字符串与指定对象进行比较,由于我们比较的是字符串对象,所以参数直接传递一个字符串
System.out.println(s1.equals(s2)
案例
用户登录
package Day8.DengLu;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-04
* time:21:13
*/
public class DengLu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//创建用户名和密码(用字符串)
String username = "a123456";
String password = "123456a";
//循环三次
for (int i = 0; i < 3; i++) {
//用户输入用户名和密码
System.out.println("请输入用户名:");
String username2 = sc.nextLine();
System.out.println("请输入密码:");
String password2 = sc.nextLine();
//判断用户名和密码是否匹配
if (username2.equals(username) && password2.equals(password)) {
System.out.println("登陆成功!");
break;
} else if (i == 0 || i == 1) {//前两次输入错误
System.out.println("登录失败,请重试!");
} else {//第三次输入错误
System.out.println("登录失败,三次机会已用完!");
break;
}
}
}
}
案例
遍历字符串
charAt:字符串索引
package Day8.StingBianLi;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-04
* time:21:36
*/
public class StringBiLi {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//用户输入字符串
System.out.println("请用户输入一个字符串:");
String s = sc.nextLine();
//遍历字符串
for (int i = 0; i < s.length(); i++){
System.out.print(s.charAt(i) + " " );
}
}
}
toCharArray:将字符串拆分为字符数组并返回
package Day8.StingBianLi;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-04
* time:21:43
*/
public class StringBiLi02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//用户输入字符串
System.out.println("请用户输入一个字符串:");
String s = sc.nextLine();
//拆分字符串数组
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
案例
统计字符次数
package Day8.ZiFuShu;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-05
* time:9:02
*/
public class ZiFuShu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
int a = 0;
int b = 0;
int c = 0;
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= 'A' && arr[i] <= 'Z') {
a++;
} else if (arr[i] >= 'a' && arr[i] <= 'z') {
b++;
} else if (arr[i] >= '0' && arr[i] <= '9') {
c++;
}
}
System.out.println("大写字母有:" + a + "个");
System.out.println("小写字母有:" + b + "个");
System.out.println("数字有:" + c + "个");
}
}
案例
手机号屏蔽
- 字符串截取
substring(int )从传入的索引位置开始,直达结束,返回截取的字符串
substring(int , int )从索引位置开始到索引位置结束,返回截取的字符串,包含头不包含尾
package Day8.ShouJiHao;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-05
* time:9:18
*/
public class ShouJiHaoJieQu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个手机号");
String s = sc.nextLine();
String s1 = s.substring(0, 3);
String s2 = s.substring(7);
System.out.println(s1 + "****" + s2);
}
}
案例
敏感词替换
- replace(旧字符串,新字符串) 替换内容
package Day8.MinGanCi;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-05
* time:9:28
*/
public class MinGanCi {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
String s1 = s.replace("TMD", "***");
System.out.println(s1);
}
}
案例
切割字符串
- split 切割并返回字符串数组
package Day8.QieGe;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-05
* time:9:39
*/
public class QieGe {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生信息:");
String stuIn = sc.nextLine();
String[] arr = stuIn.split(" ");
Stuedent stu = new Stuedent(arr[0],arr[1]);
System.out.println(stu.getName() + "..." + stu.getAge());
}
}
String 方法小结
方法名 | 说明 |
---|---|
equals | 比较字符串内容,严格区分大小写 |
equalslgnoreCase | 比较字符串内容,忽略大小写 |
length | 返回字符串长度 |
charAt | 返回索引处的char值 |
toCharArray() | 将字符串拆分为数组返回 |
substring(int,int) | 根据开始和结束索引,截取字符串(包含头,不包含尾) |
substring(int) | 根据索引位置,截取字符串,直到最后一位 |
replace(char,char) | 使用新值替换旧值(旧在前) |
split | 根据规则切割字符串 |
StringBuilder
-
是一个可变的字符串了类,可以看成一个容器
-
提高字符串的操作效率
1秒 = 1000毫秒
System.curentTimeMillis()获取1970.1.1到现在所经历的毫秒值
StringBuilder构建方法
方法名 | 说明 |
---|---|
StringBuilder | 创建一个空白可变字符串对象,不含有任何内容 |
StringBuilder(String str) | 根据字符串内容,来创建可变字符串对象 |
成员方法
方法名 | 说明 |
---|---|
append(任意类型) | 添加数据返回对象本身 |
reverse | 返回相反的字符串序列 |
length | 返回长度(字符出现的个数) |
toString | 通过toString()就可以实现吧StringBuilder转换为String |
append 可以链式编程,一直加.
区别
- String:内容是不可改变的
- StringBuilder:内容是可变的
案例
对称字符串
package Day8.DuiChen;
import java.util.Scanner;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-05
* time:10:52
*/
public class DuiChen {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = getString(sc);
StringBuilder sb = new StringBuilder(s);
String s1 = getString(sb);
print(s, s1);
}
private static void print(String s, String s1) {
if (s.equals(s1)) {
System.out.println("是对称字符串");
} else {
System.out.println("不是对称字符串");
}
}
private static String getString(StringBuilder sb) {
sb.reverse();
return sb.toString();
}
private static String getString(Scanner sc) {
System.out.println("请输入对称字符串:");
return sc.nextLine();
}
}
转换
- StringBuilder转String,通过toString()
- String转StringBuilder,通过有参构造
案例
拼接字符串
package Day8.PinJie;
/**
* description:JavaSE teaching
* author:sdjady
* date:2021-01-05
* time:11:06
*/
public class PinJie {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
String s = arrToString(arr);
System.out.println(s);
}
public static String arrToString(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]).append("]");
}else{
sb.append(arr[i]).append(", ");
}
}
String s = sb.toString();
return (s);
}
}