String类

java自学,让你从入门到放弃,快来加入我们吧。
这里实现的都是些简单基本的,高手请移步,隔壁有高级课程。

String的增加

  看到这里,想必在座的有些小朋友按耐不住了,非常想举手🙋来表示自己懂字符串的增删。嘿嘿嘿~坐下坐下,别说出来,有话,咱们进房间里面说。(搓手)

  说到String大家应该不陌生,天天使用,就连main(String[] arg)想必也敲了不下10遍吧。对不起,我敲了9遍。咳咳咳......那么我们怎么实现String类的增删呢?

  • 第一种:
String s_1, s_2 = "Hello";
s_1 = s_2 + " java!" + 3.14;

  这种方法是大家最能想到的,但是我们在这里说一些高级点的,例如使用方法来实现。哎!有同学就不懂了,为什么这么简单的东西需要方法来实现呢?这你就不懂了吧,来,坐好,让佛系老师给你们一一道来。

  • 第二种:
StringBuffer str;
str = new StringBuffer(s_2);
str.append(" java!");
str.append(Double.toString(3.14));

  看到这里,有些同学好像有些懂了,但是又不懂,这种似懂非懂的感觉正是我想要的,不然我怎么装13呢。对吧。


精讲

  在第二种方法中,使用了一个名叫StringBuffer的东西,这个是一个内容可以改变的字符串,为什么这么说呢,是因为String是静态的,他的改变需要不断创建新的对象来存储数据,这样就导致每次要从内存中创建一块空间,然后根据java的自动回收系统,把未使用不需要的空间回收,那么这里就导致很多时间空间的浪费,不利于提高效率。所以设计出了这么一个类。

  那么有同学就会说了,这里效率是多少呢,能提升多少?啥,没有人问,说是我自己编的同学。呵呵,不管,任性。

效率

  那就让我们看看这俩者之间,效率究竟如何。来人呐,上代码。

public class ConvertStringToBuffer {
    public static void main(String[] arg){
        String s_1, s_2 = "Hello";

        long startTime = System.currentTimeMillis();
        s_1 = s_2 + " java!" + 3.14;//此方法产生许多额外对象,浪费空间时间。
        long endTime = System.currentTimeMillis();
        System.out.println("s_1 = " + s_1 + " s_2 = " + s_2);
        System.out.println("Time elapsed:" + (endTime-startTime) + "ms" + "\n");

        StringBuffer str;
        str = new StringBuffer(s_2);
        long startTime_1 = System.currentTimeMillis();
        str.append(" java!");
        str.append(Double.toString(3.14));//此方法使用StringBuffer方法修改str,快的一批。
        long endTime_1 = System.currentTimeMillis();
        System.out.println("str = " + str.toString());
        System.out.println("Time elapsed:" + (endTime_1-startTime_1) + "ms");
    }
}

  我们通过System.currentTimeMillis()调用系统cpu时间来计算他们消耗的时间,以此来判断他们的效率。
  运行后,我们有了惊人的发现。大爷,请看。

s_1 = Hello java!3.14 s_2 = Hello
Time elapsed:74ms

str = Hello java!3.14
Time elapsed:2ms

  是不是很牛皮,什么,才几ms,一眨眼就没了,不慢啊。兄弟,这你就不懂了吧,我们现在处理的都是些小龙小虾,要是处理大数据,动辄上千万条字符串,增删啥的你想想要花多少时间。时间就是金钱,我的朋友。
  这里才单单几条,就出现这么惊人的比例,StringBufferString快了45倍大概。你以为呢。

统计单词

  在C++中我们也实现过统计单词的程序,无非就是统计空格数量啥的,这里也是一样的道理。
  啥都不说了,直接把代码抬上来。

import java.util.Scanner;

public class TextLine {
    int countWord(String str){
        final char blank = ' ';
        char nowChar, preChar = blank;
        int num = 0;

        for(int i = 0; i < str.length(); i++){
            nowChar = str.charAt(i);
            if(nowChar != blank && preChar == blank){
                num++;
            }
            preChar = nowChar;
        }
        return num;
    }

    public static void main(String[] arg){
        String s;
        TextLine line = new TextLine();
        System.out.println("Please input a line:");
        Scanner INPUT = new Scanner(System.in);
        s = INPUT.nextLine();
        INPUT.close();
        System.out.println("There are " + line.countWord(s) + " words.");
    }

}

简讲

  这里要说明一下的是str.charAt(i)这个方法,这个方法就相当于我们常用的数组,把String变成类似数组的东西,在C++中,string类可以直接使用数组方法(即,str[])提取里面的内容,而java中,只能使用此方法来实现。

实例

Please input a line:
CongTsang is awesome, and wisdom.
There are 5 words.

爱狂笑的孩子运气不会差