Java中史上最全String类入门介绍文章,学习StringAPI这一篇即可
文章目录
- 一、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}
/* 原因:a先在常量池创建字符串abc,然后b又要创建字符串abc,但发现常量池里面有,所以就会直接复用这个abc给b,它们指向了同一个地址值所以判断的时候是true */
⚡面试题2⚡
public static void method2(){ String s1="abc"; String s2=new String("abc"); System.out.println(s1==s2); //false //这里创建了两个字符串对象,一个是常量池里面abc,一个是堆内存里面的abc }
/* 原因: 1.s1先是在常量池创建了字符串abc//第一个字符串对象 2.s2因为 new关键字 在堆内存开辟空间如0x001,"" 双引号去到常量池找字符串abc,发现有所以复用这个abc,把这个abc拷贝过来给0x001这个地址值,所以这个地址值存储了副本abc //第二个字符串对象 3. s1存储的常量池里面的,s2存储的是地址值,所以false */
(这个图和上面的无关,同个道理而已)
⚡面试题3⚡
public static void method3(){ String s1="abc";String s2="ab";String s3=s2+"c";System.out.println(s1==s3); //false}
/*原因: 1.s1在常量池创建 字符串abc 2.s2在常量池创建 字符串ab 3.s3先在常量池创建字符串c,然后在堆内存里面创建StringBuilder对象(这是一个独立的地址值如0x001),调用append方法拼接成字符串abc,然后调用toString方法把StringBuilder转为String类型,再传给s3(新的地址值) 4.s1是常量池,s3是堆内存地址值,所以是false */扩展: /* 字符串+号拼接的原理:1.系统会 [自动的] 创建一个StringBuilder对象2.系统会 [自动的] 调用该对象的 append方法,完成字符串拼接3.系统会 [自动的] 调用该对象的 toString方法,完成类型转换 */
⚡ 面试题4⚡
public static void method4(){ String a="abc"; String b="a"+"b"+"c"; System.out.println(a==b); //true }
/* 原因: 因为Java有常量优化机制: 在javac(编译)的时候,就会将 "a" ,"b" ,"c"拼接为"abc" 所以在字节码文件中变成了 String a="abc"; String b="abc"; */
⚡面试题5⚡
public static void method5(){ /* 问创建了多少个字符串对象? 答: 3个 //一个是常量池里面的abc,两个是堆内存的abc(一个是a,一个是b) */ String a=new String("abc"); String b=new String("abc"); System.out.println(a==b); //false}
/* 1.第一步: a因为new关键字在堆内存开辟空间产生地址值如0x0011,然后因为有 "",所以去常量池创建了字符串abc, //常量池里面的abc对象然后把常量池里面的abc,拿这个副本给a,所以地址值0x0011存储了一个abc //堆内存的abc对象 2.第二步: b因为new关键字在堆内存开辟空间产生地址值如0x0022,然后因为有 "",所以去常量池准备创建abc, 但是发现常量池里面已经有了,所以直接拿副本给String b,所以地址值0x0022存储一个abc //堆内存的abc对象 */
五、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 <c.length() ; 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开始到索引4System.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,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习