嗨,你好。
下面我们一起来学习字符串和日期。
JAVA语言里面呢字符串呢有实际上分为两大类,
一类呢就是用String类来表示,它是创建之后呢
它的内容又不可以再被修改和变动。也就是所谓的immutable。
不可变动的。这是一类。
那另外一类呢就是StringBuffer和StringBuilder类。
这个呢是创建以后呢这个它的内容呢是可以被修改或变化的。
所以这种呢是另一类的字符串。
那么这一类其中呢这个StringBuilder是JDK1.5以后增加的。
它是非线程安全的。非线程安全的,也就是说它没有考虑
多个线程同时访问它会怎么样。所以相对来说呢,StringBuilder的效率要- 高一些。
那我们在使用的时候要特别注意的是呢
由于String类呢它是immutable,也就是说当我们用+= 这样的运算的时候呢String呢它会
重新生成一个新的实例,因为它的内容变了, 所以它就实际上形成了一个新的实例。所以,
如果我们在循环里面呢使用这个String+=呢可能会带来 效率问题。一定要注意这个。我们下面看一个例子。
请看这个例子
那我们在这里面一个是有个字符串s,然后呢有一个
StringBuffer,sb啊,这两个变量。
然后我们用循环N次这里呢取10000次, 那循环呢用s+=一个字符串。
或者呢我们用StringBuilder和StringBuffer呢来append
这个,那么要注意的就是用字符串呢+=实际上
JAVA它翻译成什么呢?它首先这个+啊,字符串的+首先它是
生成了一个StringBuilder早期呢是StringBuffer首先生成了这个,
然后呢再append,再toString,所以它是经过了这几步。
所以这每一步呢它都要新生成一个String对象,
还有呢StringBuilder对象。所以实际上我们循环了进行了很多次,
这样,那生成了很多这样的对象。所以它的效率呢要低一些。我们运行
看看,首先呢我们看这个s的时间,然后呢运行完以后呢我们再看一个时间,
第二个循环完了以后我们再看一下这个时间。这里是用毫秒来表示的。
看看运行结果。那么从这里可以看出呢,
我们用s+=这个循环呢用了297ms,而下面这个呢
只用了15ms,所以它们的差别还是很明显的。
那具体来说呢String这个类 它是保存了immutable的这个字符序列。
那它在用的时候呢,一个是 我们有一系列的方法,比方说这些方法,这些方法呢很多方法都返回一个
新的String对象。比如说连接,比如说替换,
比如说替换全部,还有字符串,还有toLowerCase,
变成小写,啊,toUpperCase,变大写。
trim去掉空格,啊,就前后的空格。
toString呢当然就变成字符串,那就返回它之前。
然后还有一些查找的一些方法比如说endsWith是不是以什么结尾,或者startW- ith,
是不是以什么字符串开头。indexOf,是查找一个字符串,
在它其中的位置。还有lastIndexOf就是查找最后一次
出现的位置。另外还有比较相关的比如说equals和equalsIgnoreCas- e,就是
忽略大小写的判断,是否相等。
另外还有字符以及长度的一些函数,比如说charAt,
就是字符,第几个位置的字符,然后length是整个字符串的长度
那具体的我们有一个 练习就是测试一下字符串的这些方法。
啊这里面呢我们有一个字符串,hello world
然后我们可以求它的长度,可以indexOf查找位置,等等,这些方法呢
请你有时间的时候呢可以把这个例子呢再运行然后再体会一下。
另外值得注意的是呢JDK1.5以后呢就增加了一个format函数。
就是格式化函数。把一个其他的一个整数啊实数啊等等其他的一个对象
或者基本类型把它呢替用格式,用某种格式
类型,比如说这个基本的格式字符串呢是这个样子。它有点像C语言的那个格式串。
只不过呢更复杂一点,比如说,这个格式串呢可以规定它是哪一个参数,
那么有%,有$,中间几个数字,就是第几个参数的意思。
比如这个逗号,那就表示显示千分位。然后8.5f呢就表示呢
宽度为8,小数位数呢后面占5位小数 f呢表示实数,
这种格式化的形式呢, 当然它有更多的一些格式,包括对日期啊,等等
所以你可以查看API的文档。另外要注意的呢
字符串除了那个immutable这个特点呢,还要注意的是字符串的这个常量,
也就是字面常量我们写出那个常量啊,它有个内部化问题。
所谓的内部化呢就是一样的字符串那这个常量, 它是合并的,它是合在一起的。
也就是指向同一个引用。那么从而 保证呢这个同样的字符串,你不能说ABC还不等于ABC,这两个字符串
常量不等那就不合理了。所以采取的方式呢 就是把这个我们程序里面这个所有的这个字符串常量
它都查找一遍,相同的呢都合并指向同样的这个
字符串。它有一个字符串的 池子,pool,也就说
它把所有的字符串都放在了里面,然后同样的字符串呢指向同样的字符串。
但是要注意的呢字符串常量, 比如说这个abc是相等的,两个abc是相等的。但是呢,
如果是new的这个String,那这个new String的这个
就和这个abc呢是不等的了。
另外呢StringBuffer和StringBuilder这两个类,它是保存呢可以- 修改的Unicode。
修改的那个字符序列。但是StringBuilder呢我们刚提到了就是效率 更高一点因为它没有考虑线程的安全性。
它构造方法我们可以用一个不带参数的或者说 是给一个容量的或者是给原始字符串。
另外它有些修改操作。append,追加, insert,插入,reverse反转,就是
前后反过来,颠倒过来,然后呢setCharAt修改其中的一个字符,
然后setLength,设定字符串的长度等等。所以它这些方法呢
比较特殊的就是它返回的是这个字符这个
对象本身,啊,它不像我们那个String类这些方法呢
它能返成一个新的,new一个实例。啊,也可以呢把JDK的这个
源码打开,你可以明显的看到这两个类的差别。
字符串的分工,那么JAVA.UTIL.STRINGTOKEN这类呢
提供了对字符串进行分割的功能。
恩,它可以呢构造呢可以是一个字符串然后呢分隔符, 这样的话我们就可以对这个字符串进行分割。
那么分割以后呢我们就可以得到分割的每一部分。那么为了得到分割的每一部分呢我们可以用
hasMoreTokens以及nextToken这样循环的就得到
它每一个分割的部分。我们下面看看这个例子。
请看这个例子。那在这里面呢 我们有一个StringTokenizer的这个类,
那这里面呢它给一个字符串, 就是这个文本以及分隔符,
我们这里分隔符呢是用空格来分割的。那这里面我们就可以用 while hasMoreTokens然后呢,
这里面,nextToken就得到 每一部分,那每一部分就是this这个单词,然后is这个单词,
a这个单词,等等。那下面类似呢我们可以按逗号分割这几个数字,
那它得到的就是每一个逗号分隔的这一部分。
然后呢我们可以Double.parseDouble把它每一部分呢然后加起来,
就得到总和。我们运行一下。
啊这就是我们得到的每一个单词后面呢以及它的和。