一、String类概述
1、概述
java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例。
类 String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写或小写的所有字符的字符串的副本。
2、特点
1. 字符串不变:字符串的值在创建后不能被更改
String s1 = "abc"; s1 += "d"; System.out.println(s1); // "abcd" // 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
2. 因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc"; String s2 = "abc"; // 内存中只有一个"abc"对象被创建,同时被s1和s2共享
3. "abc" 等效于 char[] data={ 'a' , 'b' , 'c' } 。
例如: String str = "abc"; 相当于: char data[] = {'a', 'b', 'c'}; String str = new String(data); // String底层是靠字符数组实现的
3、使用步骤
查看类
java.lang.String :此类不需要导入。
查看构造方法
public String() :初始化新创建的 String对象,以使其表示空字符序列。 public String(char[] value) :通过当前参数中的字符数组来构造新的String。 public String(byte[] bytes) :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。
构造举例,代码如下:
package day08.demo01; /* java.lang.String类代表字符串。 API当中说:Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 其实就是说:程序当中所有的双引号字符串,都是String类的对象。(就算没有new,也照样是。) 字符串的特点: 1. 字符串的内容永不可变。【重点】 2. 正是因为字符串不可改变,所以字符串是可以共享使用的。 3. 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。 创建字符串的常见3+1种方式。 三种构造方法: public String():创建一个空白字符串,不含有任何内容。 public String(char[] array):根据字符数组的内容,来创建对应的字符串。 public String(byte[] array):根据字节数组的内容,来创建对应的字符串。 一种直接创建: String str = "Hello"; // 右边直接用双引号 注意:直接写上双引号,就是字符串对象。 */ public class Demo01String { public static void main(String[] args) { // 使用空参构造 String str1 = new String(); // 小括号留空,说明字符串什么内容都没有。 System.out.println("第1个字符串:" + str1); // 根据字符数组创建字符串 char[] charArray = { 'A', 'B', 'C' }; String str2 = new String(charArray); System.out.println("第2个字符串:" + str2); // 根据字节数组创建字符串 byte[] byteArray = { 97, 98, 99 }; String str3 = new String(byteArray); System.out.println("第3个字符串:" + str3); // 直接创建 String str4 = "Hello"; System.out.println("第4个字符串:" + str4); } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=51578:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo01.Demo01String 第1个字符串: 第2个字符串:ABC 第3个字符串:abc 第4个字符串:Hello Process finished with exit code 0
注意:直接写上双引号,就是字符串对象
二、字符串常量池
示例代码
package day08.demo01; /* 字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中。 对于基本类型来说,==是进行数值的比较。 对于引用类型来说,==是进行【地址值】的比较。 */ public class Demo02StringPool { public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; char[] charArray = {'a', 'b', 'c'}; String str3 = new String(charArray); System.out.println(str1 == str2); // true System.out.println(str1 == str3); // false System.out.println(str2 == str3); // false } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=51792:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo01.Demo02StringPool true false false Process finished with exit code 0
原理图解
三、String类常用方法(判断功能的方法)
方法演示,代码如下:
package day08.demo02; /* ==是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法: public boolean equals(Object obj):参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true;否则返回false。 注意事项: 1. 任何对象都能用Object进行接收。 2. equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。 3. 如果比较双方一个常量一个变量,推荐把常量字符串写在前面。 推荐:"abc".equals(str) 不推荐:str.equals("abc") public boolean equalsIgnoreCase(String str):忽略大小写,进行内容比较。 */ public class Demo01StringEquals { public static void main(String[] args) { String str1 = "Hello"; String str2 = "Hello"; char[] charArray = {'H', 'e', 'l', 'l', 'o'}; String str3 = new String(charArray); System.out.println(str1.equals(str2)); // true System.out.println(str2.equals(str3)); // true System.out.println(str3.equals("Hello")); // true System.out.println("Hello".equals(str1)); // true String str4 = "hello"; System.out.println(str1.equals(str4)); // false System.out.println("================="); String str5 = null; System.out.println("abc".equals(str5)); // 推荐:false // System.out.println(str5.equals("abc")); // 不推荐:报错,空指针异常NullPointerException System.out.println("================="); String strA = "Java"; String strB = "java"; System.out.println(strA.equals(strB)); // false,严格区分大小写 System.out.println(strA.equalsIgnoreCase(strB)); // true,忽略大小写 // 注意,只有英文字母区分大小写,其他都不区分大小写 System.out.println("abc一123".equalsIgnoreCase("abc壹123")); // false } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=51866:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo02.Demo01StringEquals true true true true false ================= false ================= false true false Process finished with exit code 0
注意事项:
1. 任何对象都能用Object进行接收。
2. equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。
3. 如果比较双方一个常量一个变量,推荐把常量字符串写在前面。
四、String类常用方法(获取功能的方法)
方法演示,代码如下:
package day08.demo02; /* String当中与获取相关的常用方法有: public int length():获取字符串当中含有的字符个数,拿到字符串长度。 public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串。 public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始。) public int indexOf(String str):查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1值。 */ public class Demo02StringGet { public static void main(String[] args) { // 获取字符串的长度 int length = "asdasfeutrvauevbueyvb".length(); System.out.println("字符串的长度是:" + length); // 拼接字符串 String str1 = "Hello"; String str2 = "World"; String str3 = str1.concat(str2); System.out.println(str1); // Hello,原封不动 System.out.println(str2); // World,原封不动 System.out.println(str3); // HelloWorld,新的字符串 System.out.println("=============="); // 获取指定索引位置的单个字符 char ch = "Hello".charAt(1); System.out.println("在1号索引位置的字符是:" + ch); System.out.println("=============="); // 查找参数字符串在本来字符串当中出现的第一次索引位置 // 如果根本没有,返回-1值 String original = "HelloWorldHelloWorld"; int index = original.indexOf("llo"); System.out.println("第一次索引值是:" + index); // 2 System.out.println("HelloWorld".indexOf("abc")); // -1 } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=51980:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo02.Demo02StringGet 字符串的长度是:21 Hello World HelloWorld ============== 在1号索引位置的字符是:e ============== 第一次索引值是:2 -1 Process finished with exit code 0
五、字符串截取的方法
方法演示,代码如下:
package day08.demo02; /* 字符串的截取方法: public String substring(int index):截取从参数位置一直到字符串末尾,返回新字符串。 public String substring(int begin, int end):截取从begin开始,一直到end结束,中间的字符串。 备注:[begin,end),包含左边,不包含右边。 */ public class Demo03Substring { public static void main(String[] args) { String str1 = "HelloWorld"; String str2 = str1.substring(5); System.out.println(str1); // HelloWorld,原封不动 System.out.println(str2); // World,新字符串 System.out.println("================"); String str3 = str1.substring(4, 7); System.out.println(str3); // oWo System.out.println("================"); // 下面这种写法,字符串的内容仍然是没有改变的 // 下面有两个字符串:"Hello","Java" // strA当中保存的是地址值。 // 本来地址值是Hello的0x666, // 后来地址值变成了Java的0x999 String strA = "Hello"; System.out.println(strA); // Hello strA = "Java"; System.out.println(strA); // Java } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=52026:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo02.Demo03Substring HelloWorld World ================ oWo ================ Hello Java Process finished with exit code 0
六、转换相关的常用方法
方法演示,代码如下:
package day08.demo02; /* String当中与转换相关的常用方法有: public char[] toCharArray():将当前字符串拆分成为字符数组作为返回值。 public byte[] getBytes():获得当前字符串底层的字节数组。 public String replace(CharSequence oldString, CharSequence newString): 将所有出现的老字符串替换成为新的字符串,返回替换之后的结果新字符串。 备注:CharSequence意思就是说可以接受字符串类型。 */ public class Demo04StringConvert { public static void main(String[] args) { // 转换成为字符数组 char[] chars = "Hello".toCharArray(); System.out.println(chars[0]); // H System.out.println(chars.length); // 5 System.out.println("=============="); // 转换成为字节数组 byte[] bytes = "abc".getBytes(); for (int i = 0; i < bytes.length; i++) { System.out.println(bytes[i]); } System.out.println("=============="); // 字符串的内容替换 String str1 = "How do you do?"; String str2 = str1.replace("o", "*"); System.out.println(str1); // How do you do? System.out.println(str2); // H*w d* y*u d*? System.out.println("=============="); String lang1 = "会不会玩儿呀!你大爷的!你大爷的!你大爷的!!!"; String lang2 = lang1.replace("你大爷的", "****"); System.out.println(lang2); // 会不会玩儿呀!****!****!****!!! } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=52273:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo02.Demo04StringConvert H 5 ============== 97 98 99 ============== How do you do? H*w d* y*u d*? ============== 会不会玩儿呀!****!****!****!!! Process finished with exit code 0
CharSequence 是一个接口,也是一种引用类型。作为参数类型,可以把String对象传递到方法中
七、分割字符串的方法
package day08.demo02; /* 分割字符串的方法: public String[] split(String regex):按照参数的规则,将字符串切分成为若干部分。 注意事项: split方法的参数其实是一个“正则表达式”,今后学习。 今天要注意:如果按照英文句点“.”进行切分,必须写"\."(两个反斜杠) */ public class Demo05StringSplit { public static void main(String[] args) { String str1 = "aaa,bbb,ccc"; String[] array1 = str1.split(","); for (int i = 0; i < array1.length; i++) { System.out.println(array1[i]); } System.out.println("==============="); String str2 = "aaa bbb ccc"; String[] array2 = str2.split(" "); for (int i = 0; i < array2.length; i++) { System.out.println(array2[i]); } System.out.println("==============="); String str3 = "XXX.YYY.ZZZ"; String[] array3 = str3.split("\."); System.out.println(array3.length); // 0 for (int i = 0; i < array3.length; i++) { System.out.println(array3[i]); } } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=52583:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo02.Demo05StringSplit aaa bbb ccc =============== aaa bbb ccc =============== 3 XXX YYY ZZZ Process finished with exit code 0
八、String类的练习
1、拼接字符串
package day08.demo02; /* 题目: 定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串。格式参照如下:[word1#word2#word3]。 分析: 1. 首先准备一个int[]数组,内容是:1、2、3 2. 定义一个方法,用来将数组变成字符串 三要素 返回值类型:String 方法名称:fromArrayToString 参数列表:int[] 3. 格式:[word1#word2#word3] 用到:for循环、字符串拼接、每个数组元素之前都有一个word字样、分隔使用的是#、区分一下是不是最后一个 4. 调用方法,得到返回值,并打印结果字符串 */ public class Demo06StringPractise { public static void main(String[] args) { int[] array = {1, 2, 3, 4}; String result = fromArrayToString(array); System.out.println(result); } public static String fromArrayToString(int[] array) { String str = "["; for (int i = 0; i < array.length; i++) { if (i == array.length - 1) { str += "word" + array[i] + "]"; } else { str += "word" + array[i] + "#"; } } return str; } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=52620:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo02.Demo06StringPractise [word1#word2#word3#word4] Process finished with exit code 0
2、统计字符个数
package day08.demo02; import java.util.Scanner; /* 题目: 键盘输入一个字符串,并且统计其中各种字符出现的次数。 种类有:大写字母、小写字母、数字、其他 思路: 1. 既然用到键盘输入,肯定是Scanner 2. 键盘输入的是字符串,那么:String str = sc.next(); 3. 定义四个变量,分别代表四种字符各自的出现次数。 4. 需要对字符串一个字、一个字检查,String-->char[],方法就是toCharArray() 5. 遍历char[]字符数组,对当前字符的种类进行判断,并且用四个变量进行++动作。 6. 打印输出四个变量,分别代表四种字符出现次数。 */ public class Demo07StringCount { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String input = sc.next(); // 获取键盘输入的一个字符串 int countUpper = 0; // 大写字母 int countLower = 0; // 小写字母 int countNumber = 0; // 数字 int countOther = 0; // 其他字符 char[] charArray = input.toCharArray(); for (int i = 0; i < charArray.length; i++) { char ch = charArray[i]; // 当前单个字符 if ('A' <= ch && ch <= 'Z') { countUpper++; } else if ('a' <= ch && ch <= 'z') { countLower++; } else if ('0' <= ch && ch <= '9') { countNumber++; } else { countOther++; } } System.out.println("大写字母有:" + countUpper); System.out.println("小写字母有:" + countLower); System.out.println("数字有:" + countNumber); System.out.println("其他字符有:" + countOther); } }
运行结果
"D:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=52529:D:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:OneDrivejavasrcoutproductionOneDrive day08.demo02.Demo07StringCount 请输入一个字符串: luoahong 大写字母有:0 小写字母有:8 数字有:0 其他字符有:0 Process finished with exit code 0