> 技术文档 > [1-01-01]第42节:不可变字符序列 - String类中常用的API

[1-01-01]第42节:不可变字符序列 - String类中常用的API


Java基础学习大纲


一、常用方法

系列1:常用方法:

功能介绍

  • 1.boolean isEmpty():字符串是否为空
  • 2.int length():返回字符串的长度
  • 3.String concat(xx):拼接
  • 4.boolean equals(Object obj):比较字符串是否相等,区分大小写
  • 5.boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
  • 6.int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
  • 7.int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
  • 8.String toLowerCase():将字符串中大写字母转为小写
  • 9.String toUpperCase():将字符串中小写字母转为大写
  • 10.String trim():去掉字符串前后空白符
  • 11.public String intern():结果在常量池中共享

b.编码测试:

@Testpublic void test01(){//将用户输入的单词全部转为小写,如果用户没有输入单词,重新输入Scanner input = new Scanner(System.in);String word;while(true){System.out.print(\"请输入单词:\");word = input.nextLine();if(word.trim().length()!=0){word = word.toLowerCase();break;}}System.out.println(word);}
@Testpublic void test02(){ //随机生成验证码,验证码由0-9,A-Z,a-z的字符组成char[] array = new char[26*2+10];for (int i = 0; i < 10; i++) {array[i] = (char)(\'0\' + i);}for (int i = 10,j=0; i < 10+26; i++,j++) {array[i] = (char)(\'A\' + j);}for (int i = 10+26,j=0; i < array.length; i++,j++) {array[i] = (char)(\'a\' + j);}String code = \"\";Random rand = new Random();for (int i = 0; i < 4; i++) {code += array[rand.nextInt(array.length)];}System.out.println(\"验证码:\" + code);//将用户输入的单词全部转为小写,如果用户没有输入单词,重新输入Scanner input = new Scanner(System.in);System.out.print(\"请输入验证码:\");String inputCode = input.nextLine();if(!code.equalsIgnoreCase(inputCode)){System.out.println(\"验证码输入不正确\");}}

系列2:查找

功能介绍

(11)boolean contains(xx):是否包含xx
(12)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1
(13)int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
(14)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1
(15)int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。

b.编码测试:

@Testpublic void test01(){String str = \"尚硅谷是一家靠谱的培训机构,尚硅谷可以说是IT培训的小清华,JavaEE是尚硅谷的当家学科,尚硅谷的大数据培训是行业独角兽。尚硅谷的前端和UI专业一样独领风骚。\";System.out.println(\"是否包含清华:\" + str.contains(\"清华\"));System.out.println(\"培训出现的第一次下标:\" + str.indexOf(\"培训\"));System.out.println(\"培训出现的最后一次下标:\" + str.lastIndexOf(\"培训\"));}

系列3:字符串截取

功能介绍

(16)String substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
(17)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

b.编码测试:

@Testpublic void test01(){ String str = \"helloworldjavaatguigu\"; String sub1 = str.substring(5); String sub2 = str.substring(5,10); System.out.println(sub1); System.out.println(sub2);}@Testpublic void test02(){ String fileName = \"快速学习Java的秘诀.dat\"; //截取文件名 System.out.println(\"文件名:\" + fileName.substring(0,fileName.lastIndexOf(\".\"))); //截取后缀名 System.out.println(\"后缀名:\" + fileName.substring(fileName.lastIndexOf(\".\")));}

系列4:和字符/字符数组相关

a.功能介绍

(18)char charAt(index):返回[index]位置的字符
(19)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回
(20)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String
(21)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String
(22)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String
(23)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String

b.编码测试:

@Testpublic void test01(){//将字符串中的字符按照大小顺序排列String str = \"helloworldjavaatguigu\";char[] array = str.toCharArray();Arrays.sort(array);str = new String(array);System.out.println(str);}@Testpublic void test02(){//将首字母转为大写String str = \"jack\";str = Character.toUpperCase(str.charAt(0))+str.substring(1);System.out.println(str);}@Testpublic void test03(){char[] data = {\'h\',\'e\',\'l\',\'l\',\'o\',\'j\',\'a\',\'v\',\'a\'};String s1 = String.copyValueOf(data);String s2 = String.copyValueOf(data,0,5);int num = 123456;String s3 = String.valueOf(num); System.out.println(s1);System.out.println(s2);System.out.println(s3);}

系列5:开头与结尾

a.功能介绍

(24)boolean startsWith(xx):测试此字符串是否以指定的前缀开始
(25)boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
(26)boolean endsWith(xx):测试此字符串是否以指定的后缀结束

b.编码测试:

@Testpublic void test1(){String name = \"张三\";System.out.println(name.startsWith(\"张\"));}@Testpublic void test2(){String file = \"Hello.txt\";if(file.endsWith(\".java\")){System.out.println(\"Java源文件\");}else if(file.endsWith(\".class\")){System.out.println(\"Java字节码文件\");}else{System.out.println(\"其他文件\");}}

系列6:替换

a.功能介绍

(27)String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 不支持正则。
(28)String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
(29)String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
(30)String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串

b.编码测试:

@Testpublic void test1(){ String str1 = \"hello244world.java;887\"; //把其中的非字母去掉 str1 = str1.replaceAll(\"[^a-zA-Z]\", \"\"); System.out.println(str1); String str2 = \"12hello34world5java7891mysql456\"; //把字符串中的数字替换成,,如果结果中开头和结尾有,的话去掉 String string = str2.replaceAll(\"\\\\d+\", \",\").replaceAll(\"^,|,$\", \"\"); System.out.println(string);}

二、算法题目

题目1:模拟一个trim方法,去除字符串两端的空格

public String myTrim(String str) {if (str != null) {int start = 0;// 用于记录从前往后首次索引位置不是空格的位置的索引int end = str.length() - 1;// 用于记录从后往前首次索引位置不是空格的位置的索引while (start < end && str.charAt(start) == \' \') {start++;}while (start < end && str.charAt(end) == \' \') {end--;}if (str.charAt(start) == \' \') {return \"\";}return str.substring(start, end + 1);}return null;}@Testpublic void testMyTrim() {String str = \" a \";// str = \" \";String newStr = myTrim(str);System.out.println(\"---\" + newStr + \"---\");}

题目2:将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”

// 方式一:public String reverse1(String str, int start, int end) {// start:2,end:5if (str != null) {// 1.char[] charArray = str.toCharArray();// 2.for (int i = start, j = end; i < j; i++, j--) {char temp = charArray[i];charArray[i] = charArray[j];charArray[j] = temp;}// 3.return new String(charArray);}return null;}// 方式二:public String reverse2(String str, int start, int end) {// 1.String newStr = str.substring(0, start);// ab// 2.for (int i = end; i >= start; i--) {newStr += str.charAt(i);} // abfedc// 3.newStr += str.substring(end + 1);return newStr;}// 方式三:推荐 (相较于方式二做的改进)public String reverse3(String str, int start, int end) {// ArrayList list = new ArrayList(80);// 1.StringBuffer s = new StringBuffer(str.length());// 2.s.append(str.substring(0, start));// ab// 3.for (int i = end; i >= start; i--) {s.append(str.charAt(i));}// 4.s.append(str.substring(end + 1));// 5.return s.toString();}@Testpublic void testReverse() {String str = \"abcdefg\";String str1 = reverse3(str, 2, 5);System.out.println(str1);// abfedcg}

题目3:获取一个字符串在另一个字符串中出现的次数

  • 比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数
// 第3题// 判断str2在str1中出现的次数public int getCount(String mainStr, String subStr) {if (mainStr.length() >= subStr.length()) {int count = 0;int index = 0;// while((index = mainStr.indexOf(subStr)) != -1){// count++;// mainStr = mainStr.substring(index + subStr.length());// }// 改进:while ((index = mainStr.indexOf(subStr, index)) != -1) {index += subStr.length();count++;}return count;} else {return 0;}}@Testpublic void testGetCount() {String str1 = \"cdabkkcadkabkebfkabkskab\";String str2 = \"ab\";int count = getCount(str1, str2);System.out.println(count);}

题目4:获取两个字符串中最大相同子串

  • 比如:str1 = \"abcwerthelloyuiodef“;str2 = “cvhellobnm”,提示:将短的那个串进行长度依次递减的子串与较长的串比较。
// 第4题// 如果只存在一个最大长度的相同子串public String getMaxSameSubString(String str1, String str2) {if (str1 != null && str2 != null) {String maxStr = (str1.length() > str2.length()) ? str1 : str2;String minStr = (str1.length() > str2.length()) ? str2 : str1;int len = minStr.length();for (int i = 0; i < len; i++) {// 0 1 2 3 4 此层循环决定要去几个字符for (int x = 0, y = len - i; y <= len; x++, y++) {if (maxStr.contains(minStr.substring(x, y))) {return minStr.substring(x, y);}}}}return null;}// 如果存在多个长度相同的最大相同子串// 此时先返回String[],后面可以用集合中的ArrayList替换,较方便public String[] getMaxSameSubString1(String str1, String str2) {if (str1 != null && str2 != null) {StringBuffer sBuffer = new StringBuffer();String maxString = (str1.length() > str2.length()) ? str1 : str2;String minString = (str1.length() > str2.length()) ? str2 : str1;int len = minString.length();for (int i = 0; i < len; i++) {for (int x = 0, y = len - i; y <= len; x++, y++) {String subString = minString.substring(x, y);if (maxString.contains(subString)) {sBuffer.append(subString + \",\");}}System.out.println(sBuffer);if (sBuffer.length() != 0) {break;}}String[] split = sBuffer.toString().replaceAll(\",$\", \"\").split(\"\\\\,\");return split;}return null;}// 如果存在多个长度相同的最大相同子串:使用ArrayList//public List getMaxSameSubString1(String str1, String str2) {//if (str1 != null && str2 != null) {//List list = new ArrayList();//String maxString = (str1.length() > str2.length()) ? str1 : str2;//String minString = (str1.length() > str2.length()) ? str2 : str1;////int len = minString.length();//for (int i = 0; i < len; i++) {//for (int x = 0, y = len - i; y <= len; x++, y++) {//String subString = minString.substring(x, y);//if (maxString.contains(subString)) {//list.add(subString);//}//}//if (list.size() != 0) {//break;//}//}//return list;//}////return null;//}@Testpublic void testGetMaxSameSubString() {String str1 = \"abcwerthelloyuiodef\";String str2 = \"cvhellobnmiodef\";String[] strs = getMaxSameSubString1(str1, str2);System.out.println(Arrays.toString(strs));}

题目5:对字符串中字符进行自然顺序排序

提示:
1)字符串变成字符数组。
2)对数组排序,选择,冒泡,Arrays.sort();
3)将排序后的数组变成字符串。

// 第5题@Testpublic void testSort() {String str = \"abcwerthelloyuiodef\";char[] arr = str.toCharArray();Arrays.sort(arr);String newStr = new String(arr);System.out.println(newStr);}