2017-03-20-String类的方法
思考
实例2的思路4中的几种方法的内在逻辑的区别,不要只是会
知识点1:
final 修饰
final String str=null;//有效初始化
后面无法被修改
1 2 3 4 5 6 7 8 9
| for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
str=i+j+"";
}
}
|
知识点2:
foreach
只能对数组和集合进行遍历,不能对其数组和集合进行操作。
知识点3:
i++和++i的内存执行过程的区别,
++i的执行效率更高,i++的执行效率低的原因是i++在执行前先要在内存中创建一个临时变量将i的初始值存放起来再返回初始值,再执行i的值加1;
int i=1;
i+=i++;//i=i+i++;
i+=i++;在c中的结果(i=3)和java中的结果(i=2)不一样,原因在于java中在i++中先将i的副本取出来用了,还没更新i就已经执行赋值,c是等i更新完了再赋值。压栈和出栈,java压栈比c快一步。
知识点4:
String
字符串常量池
知识点5:
基本数据类型传参
引用数据类型传参
知识点6:
String类的一些方法
charAt();
indexof();
substring();
…..
实例1:
编写一个程序,输出一个字符串中的大写英文字母个数,小写英语字母个数,数字个数,和其他字符个数
思路:
1.将字符串中的每个字符遍历出来,然后直接判断ascii码表中的范围(或者直接写出字符的范围,原理其实就是ascii码表中的范围连续)
2.indexof和charAt进行判断
3.用char的包装类来进行判断操作
思路1核心代码:
ascii码表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public static void test3() { String s = "AsfsBdfsdf&%^&$954832 _fAFg"; char[] c = s.toCharArray(); int bigEnCount = 0; int littleEnCount = 0; int numCount = 0; int otherCount = 0; for (char ch : c) { if (ch >= 65 && ch <= 90) { bigEnCount++; } else if (ch >= 97 && ch <= 122) { littleEnCount++; } else if (ch >= 48 && ch <= 57) { numCount++; } else { otherCount++; } } System.out.println("大写英文字母个数:" + bigEnCount); System.out.println("小写英文字母个数:" + littleEnCount); System.out.println("数字个数:" + numCount); System.out.println("其他字符个数:" + otherCount); }
|
字符范围:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public static void test31(){ String s = "AsfsBdfsdf&%^&$954832 _fAFg"; int bigEnCount = 0; int littleEnCount = 0; int numCount = 0; int otherCount = 0; for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(c>='a'&&c<='z'){ littleEnCount++; }else if(c>='A'&&c<='Z'){ bigEnCount++; }else if(c>='0'&&c<='9'){ numCount++; }else{ otherCount++; } } System.out.println("大写英文字母个数:" + bigEnCount); System.out.println("小写英文字母个数:" + littleEnCount); System.out.println("数字个数:" + numCount); System.out.println("其他字符个数:" + otherCount); }
|
思路2核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public static void test32(){ String s = "AsfsBdfsdf&%^&$954832 _fAFg"; String lowerAlphabet="qwertyuiopasdfghjklzxcvbnm"; String upperAlphabet=lowerAlphabet.toUpperCase(); String digital="0123456789"; int lowerCount=0; int upperCount=0; int digitCount=0; int otherCount=0; for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(lowerAlphabet.indexOf(c)!=-1){ lowerCount++; }else if(upperAlphabet.indexOf(c)!=-1){ upperCount++; }else if(digital.indexOf(c)!=-1){ digitCount++; }else{ otherCount++; } } System.out.println("大写英文字母个数:" + upperCount); System.out.println("小写英文字母个数:" + lowerCount); System.out.println("数字个数:" + digitCount); System.out.println("其他字符个数:" + otherCount); }
|
思路3核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public static void test33(){ String s = "AsfsBdfsdf&%^&$954832 _fAFg"; char[] c=s.toCharArray(); int lowerCount=0; int upperCount=0; int digitCount=0; int otherCount=0; for(char ch:c){ if(Character.isLowerCase(ch)){ lowerCount++; }else if(Character.isUpperCase(ch)){ upperCount++; }else if(Character.isDigit(ch)){ digitCount++; }else{ otherCount++; } } System.out.println("大写英文字母个数:" + upperCount); System.out.println("小写英文字母个数:" + lowerCount); System.out.println("数字个数:" + digitCount); System.out.println("其他字符个数:" + otherCount); }
|
实例2:
判断String s = “sunjavahpjavaokjavajjavahahajavajavagoodjava”;中存在多少个java
思路:有5种思路
1.将java替换成任意三个字符的字符串“XXX”,用两次的长度相减得到个数
2.使用indexof(String str);和indexof(String str,int i);结合来做
3.使用subString();和startsWith();来做
4.使用split来做,不过要用很多的判断来判断特殊情况(特殊情况中用思路3来做)
5.循环来做,将字符串中的一个,然后把其后面的三个字符都提取出来,判断是否为“java”,最朴实的方法
思路1核心代码:
1 2 3 4 5
| public static void test5() { String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; String str = s.replace("java", "xxx"); System.out.println("字符串中有" + (s.length() - str.length()) + "个java"); }
|
思路2核心代码:
使用indexof(String str)和indexof(String str,int i)的方式(自己第一感觉的做法,代码看起来也比较优雅)
1 2 3 4 5 6 7 8 9 10 11
| public static void test4() { String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; int index = s.indexOf("java"); System.out.println(index); int count = 0; while (index != -1) { count++; index = s.indexOf("java", index + 4); } System.out.println("字符串中java的个数:" + count); }
|
只使用indexof(String str,int i)的方式(老师的思维方式,死循环,判断,思路不清晰代码比较繁杂)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public static void test41(){ String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; String s1="java"; int index=0; int count=0; while(true){ index=s.indexOf(s1,index); if(index!=-1){ count++; index+=4; }else{
break;
}
} System.out.println("字符串中java的个数:" + count); }
|
思路3核心代码:
substring()和startsWith()方法实现(自己思考出来的)
1 2 3 4 5 6 7 8 9 10 11
| public static void test7() { String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; int count = 0; for (int i = 0; i < s.length(); i++) { String str = s.substring(i); if (str.startsWith("java")) { count++; } } System.out.println("字符串中有" + count + "个java"); }
|
indexof()和substring()方法实现(老师的思路)
不用死循环实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| while()实现:
public static void test71(){ String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; int count=0; int index=0; while(index<s.length()-4){ index=s.indexOf("java"); count++; s=s.substring(index+4); } System.out.println("字符串中有" + count + "个java"); }
|
do{}while();实现;
1 2 3 4 5 6 7 8 9 10 11 12
| public static void test73(){ String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; int count=0; int index=0; do{ index=s.indexOf("java"); count++; s=s.substring(index+4); }while(index<s.length()); System.out.println("字符串中有" + count + "个java"); }
|
死循环实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public static void test72(){ String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; String s1="java"; int index=0; int count=0; while(true){ index=s.indexOf(s1); if(index!=-1){ count++; s=s.substring(index+s1.length()); }else{ break; } } System.out.println("字符串中有" + count + "个java");
}
|
思路4核心代码:
修改字符串以实现统一情况:(巧妙的方法,自己有过灵感,但是没有捕捉下来实现,真的挺可惜的,后来一位同学提出这种想法,脑子里真的感觉这个思路很熟悉)
1 2 3 4 5 6
| public static void test11(){ String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; s=s+" "; String[] s1=s.split("java"); System.out.println("字符串中有:"+(s1.length-1)+"个java"); }
|
不修改原字符串进行判断(还有点问题)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public static void test1(){ String s="1javajavajavajava"; String[] s1=s.split("java"); int length=s1.length-1; if(s.endsWith("java")){ if(s.startsWith("java")){ if(s.length()==4){ length=1; }else{ length+=3; s=s.substring(4); s=s.substring(0,s.length()-4); while(s.startsWith("java")){ length++; s=s.substring(4); } } }else{ do{ length++; s=s.substring(0,s.length()-4); }while(s.endsWith("java")); } } System.out.println("长度:"+length); }
|
思路5核心代码:
从第一个开始遍历控制次数来避免下标越界:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static void test8() { String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; int count = 0; for (int i = 0; i < s.length() - 3; i++) { char c1 = s.charAt(i); char c2 = s.charAt(i + 1); char c3 = s.charAt(i + 2); char c4 = s.charAt(i + 3); if (c1 == 'j' && c2 == 'a' && c3 == 'v' && c4 == 'a') { count++; } } System.out.println("字符串中有" + count + "个java"); }
|
从第4个开始遍历,不用控制次数直接避免下标越界:
1 2 3 4 5 6 7 8 9 10 11 12
| public static void test9() { String s = "sunjavahpjavaokjavajjavahahajavajavagoodjava"; char[] c = s.toCharArray(); int count = 0; for (int i = 3; i < s.length(); i++) { if (c[i - 3] == 'j' && c[i - 2] == 'a' && c[i - 1] == 'v' && c[i] == 'a') { count++; } } System.out.println("字符串中有" + count + "个java"); }
|