2017-03-20-String类的方法
Xplorist Lv6

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+"";//将(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;

          }

          /*if(index>=s.length()){
                break;
            }*///老师写的这个判断其实没有必要,本来indexof()方法的结果是不是-1就能够判断了,即使给定的下标位置大于了数组的实际长度,也是返回-1,所以这个判断不够简练而且也没有必要
        }
        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");
    }

 评论