- 一、String的概述
- 二、String类的特点
- 三、String类常见构造方法
- public String() : 创建一个空白的字符串对象
- public String(String s): 根据传入的字符串,创建字符串对象
- public String(char[] chs) : 根据传入的字符数组,创建字符串对象
- 四、两种创建字符串对象的区别对比与面试题
- 1、创建字符串对象的两种方式有什么区别 ?
- ⚡面试题1⚡
- ⚡面试题2⚡
- ⚡面试题3⚡
- ⚡ 面试题4⚡
- ⚡面试题5⚡
- 五、String类的常用成员方法
- equals和 equalsIgnoreCase(比较字符串)
- (1)public boolean equals(Object anObject) : 两个字符串之间做比较,比较内容, 返回true,false的结果
- (2) public boolean equalsIgnoreCase(String anotherString): 两个字符串之间比较,比较内容,忽略大小写,返回true,false的结果(用于验证码多)
- length方法(获取字符串长度)
- (1)public int length() : 返回字符的个数
- toCharArray()和charAt(int index)方法(都可以用来遍历获取所有字符)
- (1)public char[] toCharArray() : 将此字符串转换为新的字符数组
- (2)public char charAt(int index) : 返回指定索引处的 char值(根据索引找字符)
- substring()方法(用于截取字符串,没被截到就被舍弃了)
- (1)public String substring(int beginIndex) : 根据传入的索引截取当前字符串,截取到末尾
- (2)public String substring(int beginIndex, int endIndex): 根据传入开始和结束索引,截取字符串,并返回新的字符串 包括开始索引,不包括结束索引(包头,不包尾)
- ❓案例:
- split方法()(用于切割字符串的方法)
- (1)public String[] split(String regex):根据传入的字符串参数,作为规则,切割当前字符串
- (2)public String[] split(String regex, int limit): 根据传入的字符串参数和限制长度,作为规则,切割当前字符串 (就是把字符串分成几段)
- 扩展:
- ❓问题1:当切割到正则表达式符号的时候会切割失败
- ⭕解决方法:使用转义字符 '\' 就可以解决
- ❓ 问题2:当切割多个字符的时候会切割失败
- ⭕解决方法:当需要多个字符切割的时候要用到 | 这个分开
- 总结注意
- replace中的四个方法(用于替换字符串的方法)
- (1)public String replace(char oldChar, char newChar): 返回从替换所有出现的导致一个字符 oldChar,在这个字符 newChar (替换字符)
- (2)public String replace (CharSequence target, CharSequence replacement): CharSequence target:字符串旧值, CharSequence replacement:字符串新值, 将与字面目标序列匹配的字符串的每个子字符串替换为指定的文字替换序列 (替换字符串)
- (3)public String replaceAll(String regex, String replacement):替换所有字符串 (替换所有和目标值一样的字符串,不过因为参数是regex正则表达式,当替换正则表达式时会报错,需要加转义)
- (4)public String replaceFirst(String regex, String replacement) : 替换第一个出现的目标值
- ❓ 案例:录入一个字符串,如果字符串包含(TMD),使用***替换
- ⚡replace()和replaceAll()的区别⚡
- 总结:
- 作者:KJ.JK
一、String的概述
* String类 在"java.lang"包下,所以使用的时候不需要导包
* String 类 代表字符串,Java程序中的所有字符串文字(例如"abc")都被实现为此类的实例,
也就是说,"Java程序中所有的双引号字符串,都是String类的对象"
* 字符串不可变,它们的值在创建后不能被更改
二、String类的特点
String 类的特点:
1. Java程序中,所有双引号字符串,都是String这个类的对象
2.String字符串一旦被创建,就[不可更改] --内容不可更改
String a="abc";
a="def"; //这里的更改其实只是用新的对象替换,原来的内容根本改不了
3.String 字符串虽然不可改变,但是可以被共享
4.字符串和字符数组之间允许互相转换
char [] chs ={ 'a' ,'b' ,'c'};
String s3=new String(chs);
三、String类常见构造方法public String() : 创建一个空白的字符串对象
String s1=new String(); //创建一个空白的字符串对象
System.out.println(s1);
public String(String s): 根据传入的字符串,创建字符串对象
String s2=new String("abc");
System.out.println(s2);
public String(char[] chs) : 根据传入的字符数组,创建字符串对象
char[] chs={'a','b','c'};
String s3=new String(chs);
System.out.println(s3);
四、两种创建字符串对象的区别对比与面试题 1、创建字符串对象的两种方式有什么区别 ?
创建字符串对象的两种方式有什么区别 ?
1).双引号直接创建(知道内容直接"") : 在常量池维护
2).通过构造方法new出来的字符串对象(不知道就new String创建) : 在堆内存有自己独立的内存空间
常量池特点:
当我们使用 "" 双引号创建字符串对象的时候,会检查该数字在常量池是否存在
不存在:创建
存在:复用
⚡面试题1⚡
public static void method(){
String a="abc";
String b="abc";
System.out.println(a==b); //这里输出是true
}
⚡面试题2⚡
public static void method2(){
String s1="abc";
String s2=new String("abc");
System.out.println(s1==s2); //false
//这里创建了两个字符串对象,一个是常量池里面abc,一个是堆内存里面的abc
}
(这个图和上面的无关,同个道理而已)
⚡面试题3⚡
public static void method3(){
String s1="abc";
String s2="ab";
String s3=s2+"c";
System.out.println(s1==s3); //false
}
扩展:
⚡ 面试题4⚡
public static void method4(){
String a="abc";
String b="a"+"b"+"c";
System.out.println(a==b); //true
}
⚡面试题5⚡
public static void method5(){
String a=new String("abc");
String b=new String("abc");
System.out.println(a==b); //false
}
五、String类的常用成员方法 equals和 equalsIgnoreCase(比较字符串)
(1)public boolean equals(Object anObject) : 两个字符串之间做比较,比较内容, 返回true,false的结果
String a="abc";
String b="abc";
System.out.println(a.equals(b)); //true
(2) public boolean equalsIgnoreCase(String anotherString): 两个字符串之间比较,比较内容,忽略大小写,返回true,false的结果(用于验证码多)
String a1="abc";
String b1="Abc";
System.out.println(a1.equalsIgnoreCase(b1)); //true
length方法(获取字符串长度)
(1)public int length() : 返回字符的个数
String a="abc";
int b =a.length();
注意:
String中的length() --> 方法 如: arr.length()
数组中的length --> 属性 如: arr.length
toCharArray()和charAt(int index)方法(都可以用来遍历获取所有字符)
(1)public char[] toCharArray() : 将此字符串转换为新的字符数组
String a="abc";
char [] a1=a.toCharArray();
for (int i = 0; i < a1.length; i++) {
System.out.println(a1[i]); //获取各个元素
}
(2)public char charAt(int index) : 返回指定索引处的 char值(根据索引找字符)
//返回指定索引处的 char值
String b="abc";
char b1=b.charAt(0);
System.out.println(b1); //输出a
//也可以用来遍历获取所有字符
String c="abc";
for (int i = 0; i //用到length()方法,效率没有上面的高
System.out.println(c.charAt(i));
}
substring()方法(用于截取字符串,没被截到就被舍弃了)
(1)public String substring(int beginIndex) : 根据传入的索引截取当前字符串,截取到末尾
String s="HelloWorld";
String s1=s.substring(2); //从索引2开始到末尾
System.out.println(s1); //lloWorld
(2)public String substring(int beginIndex, int endIndex): 根据传入开始和结束索引,截取字符串,并返回新的字符串 包括开始索引,不包括结束索引(包头,不包尾)
String a="HelloWorld";
String a1=a.substring(2,4); //从索引2开始到索引4
System.out.println(a1); //ll
❓案例:
需求:以字符的形式从键盘接收一个手机号,将中间的四位号码屏蔽
如:156****1234
Scanner rd=new Scanner(System.in);
String tel=rd.next();
String start=tel.substring(0,3); //前三位
String end=tel.substring(7,11); //后四位
tel=start+"****"+end;
System.out.println(tel); //156****1234
split方法()(用于切割字符串的方法)
(1)public String[] split(String regex):根据传入的字符串参数,作为规则,切割当前字符串
String a="198,168,10,1";
String [] arr=a.split(",");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
(2)public String[] split(String regex, int limit): 根据传入的字符串参数和限制长度,作为规则,切割当前字符串 (就是把字符串分成几段)
String b="2022-04-19";
String[] b1=b.split("-",2); //分成两段
for (int i = 0; i < b1.length; i++) {
System.out.println(b1[i]);
}
扩展:
❓问题1:当切割到正则表达式符号的时候会切割失败
String a1="198.198.156";
String [] arr1=a1.split(".");
//当用正则表达式.切割的时候会出现什么都没有的情况,这是因为参数是正则表达式,而.在正则表达式中表任意字符,所以切割的时候会都切了
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
⭕解决方法:使用转义字符 ‘’ 就可以解决
String a1="198.198.156";
String [] arr2=a1.split("\.");
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
❓ 问题2:当切割多个字符的时候会切割失败
String s="198.19@19";
String [] sarr=s.split("\.@"); //当需要多个字符切割的时候要用到 | 这个,要不然会不生效或者生效一个
for (int i = 0; i < sarr.length; i++) {
System.out.println(sarr[i]); //198.19@19
}
⭕解决方法:当需要多个字符切割的时候要用到 | 这个分开
String s2="198.19@19";
String [] s2arr=s2.split("\.|@");
for (int i = 0; i < s2arr.length; i++) {
System.out.println(s2arr[i]);
}
总结注意
1.split返回是一个字符串数组接收
2.为了防止切割的时候会因为正则表达式出现空白的情况,
以后所有切割都用\为开头就行
3. 多个符号切割时记得用|分开
replace中的四个方法(用于替换字符串的方法)
(1)public String replace(char oldChar, char newChar): 返回从替换所有出现的导致一个字符 oldChar,在这个字符 newChar (替换字符)
String a="abc";
String a1=a.replace("b","d");
System.out.println(a1);
(2)public String replace (CharSequence target, CharSequence replacement): CharSequence target:字符串旧值, CharSequence replacement:字符串新值, 将与字面目标序列匹配的字符串的每个子字符串替换为指定的文字替换序列 (替换字符串)
String a="Hello";
String a1=a.replace("H","a");
System.out.println(a1); //aello
(3)public String replaceAll(String regex, String replacement):替换所有字符串 (替换所有和目标值一样的字符串,不过因为参数是regex正则表达式,当替换正则表达式时会报错,需要加转义)
String b="hello.hello";
String b1=b.replaceAll("hello","nihao");
System.out.println(b1); //nihao.nihao
(4)public String replaceFirst(String regex, String replacement) : 替换第一个出现的目标值
String c="hellohello";
String c1=c.replaceFirst("hello","nihao");
System.out.println(c1); //nihaohello
❓ 案例:录入一个字符串,如果字符串包含(TMD),使用***替换
Scanner rd=new Scanner(System.in);
String content=rd.next();
content=content.replace("TMD","***");
System.out.println(content);
⚡replace()和replaceAll()的区别⚡
注意:replaceAll在遇到正则表达式字符的时候会报错要加转义字符才行
例子:
String s="hello\hello\hello";
String replace=s.replace("\","55");
// String replaceAll=s.replaceAll("\","55"); //报错不支持这个语法
String replaceAll2=s.replaceAll("\\","55"); //这个样子才成功
System.out.println(replace); //hello55hello55hello
System.out.println(replaceAll2); //hello55hello55hello
总结:
尽量用replace,因为和replaceAll是一样的替换所有的结果
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习



