String常用类
String类
String是定义在java.lang包的一个类,(lang包的类)使用时不用导包。
所有字符串文字如"abc"、"请输入"都是String类的对象
字符串不可变,它们的值在创建后不能被更改。
String name1="a";
String name2="b";
System.out.println(name1+name2);
//有3个字符串,name1、name2、name1+name2
String name3="c";
String name3="d";
//有2个字符串
创建String对象的两种方法
- 直接赋值
String name="name";
- new
![]()
public static void main(String[] args) {
//1.直接赋值
String s1 = "abc";
System.out.println("s1=" + s1);
//2.1 获取一个空白字符串对象
String s2 = new String();
System.out.println("s2="+s2);//" "
//2.2 根据传入的字符串创建字符串对象(不推荐)
String s3 = new String("123");
System.out.println("s3="+s3);
//2.3 根据传入的字符数组创建一个字符串对象
char[] chs = {'a', 'b', 'c'};
String s4 = new String(chs);
System.out.println("s4="+s4);
/*应用场景:可以通过改变数组,实现改变字符串的内容
chs:{'a', 'b', 'c'}→{'q', 'b', 'c'},s4:abc→qbc
*/
//2.4 根据传入的字节数组创建一个字符串对象
byte[] bytes = {97,98,99};
String s5=new String(bytes);
System.out.println("s5="+s5);
//应用场景:在网络中传输的数据一般是字节信息,需要用到此构造
}

内存分析
- 直接赋值的,会先在字符串常量池中找有没有对应的字符串,如"abc"
如果没有就添加进常量池中,再将对应的地址如0x0011赋值给s1。如果有就直接将对应的地址赋值给对应的String对象,如s2。
![]()
- new出来的,每个new出来的对象会单独在堆中开辟一个小空间来存放字符串,这样尽管字符串内容相同,其对应的地址不同。
![]()
==号
==比较的是什么?

字符串比较
只要比较字符串的内容就必须使用String里面的方法
equals方法
public static void main(String[] args) {
String s1=new String("abc");
String s2="abc";
System.out.println(s1==s2);
boolean result2=s1.equals(s2);
System.out.println(result2);
}

不区分大小写,equalsIgnoreCase方法
public static void main(String[] args) {
String s1=new String("abc");
String s2="Abc";
boolean result=s1.equalsIgnoreCase(s2);
System.out.println(result);
}


因为scanner.next()是new出来的
模拟用户登录
package StringTest;
import java.util.Scanner;
public class t3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String rightUser = "Benson";
String rightKey = "123456";
for (int i = 0; i < 3; i++) {
System.out.print("请输入用户名:");
String user = scanner.next();
System.out.print("请输入密码:");
String key = scanner.next();
if (rightUser.equals(user) && rightKey.equals(key)) {
System.out.println("登录成功");
break;
} else {
System.out.println("密码错误或用户不存在");
if (i <= 1) {
System.out.println("剩余次数:" + (2 - i) + "次");
} else {
System.out.println("密码错误过多,请24小时后再次登录");
}
}
}
scanner.close();
}
}
字符串索引
charAt()方法
public static void main(String[] args) {
String s1="abc";
System.out.println(s1.charAt(0));//a
}
字符串索引与数组下标类似,字符串abc的0索引是a,1索引是b,2索引是c
统计字符串的大小写字母和数字的个数
package StringTest;
import java.util.Scanner;
public class t4 {
public static void main(String[] args) {
//统计字符串的大小写字母和数字的个数
int bigCount = 0;
int smallCount = 0;
int numCount = 0;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入字符串:");
String s1 = scanner.next();
for (int i = 0; i < s1.length(); i++) {
//i表示每个字符串的索引
char c = s1.charAt(i);
//char类型的变量在参与计算时会自动提升为int类型
if (c >= 'a' && c <= 'z') {
smallCount++;
} else if (c >= 'A' && c <= 'Z') {
bigCount++;
} else if (c >= '0' && c <= '9') {//要带上''
numCount++;
}
}
System.out.println("大写的字母有" + bigCount + "个");
System.out.println("小写的字母有" + smallCount + "个");
System.out.println("数字有" + numCount + "个");
}
}
{,,}变成[,,]
package StringTest;
public class t5 {
public static void main(String[] args) {
int[] array1={1,2,3};
String s1=arrToString(array1);
System.out.println(s1);
}
public static String arrToString(int[] arr){
if (arr==null){
return "";
}
if (arr.length==0){
return "[]";
}
String result="[";
for (int i=0;i<arr.length;i++){
if (i==arr.length-1){
result=result+arr[i];//字符串拼接
}else{
result=result+arr[i]+",";
}
}
result=result+"]";
return result;
}
}
字符串反转
package StringTest;
import java.util.Scanner;
public class t6 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("请输入字符串:");
String s1=scanner.next();
String a=reverse(s1);
System.out.println(a);
}
public static String reverse(String str){
String result="";
for (int i=str.length()-1;i>=0;i--){
char c=str.charAt(i);
result=result+c;
}
return result;
}
}
手机号屏蔽 substring方法
package StringTest;
import java.util.Scanner;
public class t7 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("请输入电话号码:");
String phoneNumber=scanner.next();
//截取前三位
String font=phoneNumber.substring(0,3);
//截取后四位
String end=phoneNumber.substring(7);
String result=font+"****"+end;
System.out.println(result);
}
}

敏感词屏蔽 replace方法
package StringTest;
public class t8 {
public static void main(String[] args) {
String s1 = "cnm,你给我去spa!";
String s2 = s1.replace("cnm", "**");
System.out.println(s2);
//现实中是通过敏感词库来检测敏感词的
String[] arr = {"cnm", "spa", "wdnmd", "sb", "jb"};
for (int i = 0; i < arr.length; i++) {
s1 = s1.replace(arr[i], "**");
}
System.out.println(s1);
}
}

StringBuilder

如果按一般方法来拼接字符串一百万次,那么速度会很慢,每次拼接后在内存层面都会产生一个新的字符串
但使用StringBuilder会能在短时间内解决
- 构造方法
![]()
- 常用方法
![]()
StringBuilder可以看做一个容器,里面的内容可以发送改变。 - 应用场景
1.字符串拼接
2.字符串反转
public static void main(String[] args) {
//1.创建StringBuilder对象
StringBuilder sb1=new StringBuilder();
System.out.println("sb1="+sb1);//sb1=
//结果是空的,而不是地址值。
//因为java对StringBuilder类做了特殊处理,使其对象打印出的值是属性值而非地址值
//2.添加元素
StringBuilder sb2=new StringBuilder("abc");
sb2.append(3.14);
sb2.append("d");
sb2.append(true);
System.out.println("sb2="+sb2);//abc3.14dtrue
// 但sb2还不是字符串,只是StringBuilder的内容
//3.反转
sb2.reverse();
System.out.println("sb2反转后="+sb2);
//4.获取长度
int a=sb2.length();
System.out.println("sb2的长度="+a);
//5.转为字符串
String str=sb2.toString();//此时把sb2转回了字符串
System.out.println(str.equals("abc"));
}
链式编程
package StringTest;
import java.util.Scanner;
public class t10 {
public static void main(String[] args) {
//链式编程
//当在调用一个方法时不需要用变量接收它的结果,可以继续在此基础上调用其他方法
int length=getString().substring(1).replace("b","q").length();
//=左边就是一串链式编程
System.out.println(length);
}
public static String getString(){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入字符串:");
String str=scanner.next();
return str;
}
}

append返回的还是StringBuilder对象,所以也可以采用链式编程
StringBuilder sb3=new StringBuilder("cba");
sb3.append(3.14).append("d").append(false);
System.out.println("sb3="+sb3);//sb3=cba3.14dfalse
判断字符串是否对称
package StringTest;
import java.util.Scanner;
public class t11 {
public static void main(String[] args) {
//判断字符串是否对称
Scanner scanner=new Scanner(System.in);
System.out.print("请输入字符串:");
String str=scanner.next();
String result=new StringBuilder().append(str).reverse().toString();
if (result.equals(str)){
System.out.println("对称");
}else{
System.out.println("不对称");
}
}
}

StringBuilder实现{}→[]
public static void main(String[] args) {
int[] array1 = {1, 2, 3};
String str = arrToString(array1);
System.out.println(str);//[1,2,3]
}
public static String arrToString(int[] arr) {
StringBuilder sb = new StringBuilder();
if (arr == null) {
return sb.toString();
}
if (arr.length == 0) {
return sb.append("[").append("]").toString();
}
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("]");
return sb.toString();
}
StringJoiner
- 应用场景
用于字符串拼接时的添加间隔、开头、结尾的字符 - 构造方法
![]()
- 成员方法
![]()
//1.创建对象
StringJoiner sj=new StringJoiner(",");
//2.添加元素,只能是字符串
sj.add("a").add("b").add("c");
//3.打印
System.out.println(sj);//a,b,c
//用,间隔 用[拼接在开头 用]拼接在末尾
StringJoiner sj1=new StringJoiner(",","[","]");
sj1.add("a").add("b").add("c");
System.out.println(sj1);//[a,b,c]
//获取长度
System.out.println(sj1.length());//7
//变成String类型
System.out.println(sj1.toString());








浙公网安备 33010602011771号