Java学习笔记 - 05

来源:互联网 发布:圣思园张龙java视频 编辑:程序博客网 时间:2024/05/19 06:47

Java Strings

*不像其他语言将字符串理解为字符构成的数组,Java中字符串有专门的类:String, StringBuffer,StringTokenizer.

构造一个字符串:

String newString = new String(stringLiteral);

或者使用*简化声明方式:
String newString = stringLiteral;

同样也可以将字符数组转换为String类:
char[] charArray = {'G', 'o', 'o', 'd', ' ', 'D', 'a', 'y'};String message = new String(charArray);

Canonical Strings(规范化字符串):

JAVA中的String类所维护的字符串是不可变的,但是为了方便有些经常使用的字符串,JVM为了提高效率并且节省内存,通过将两个使用简化声明方式声明的有相同内容的字符串对象存为一个对象。
e.g.
String s0 = "Welcome to Java";String s1 = new String("Welcome to Java");String s2 = s1.intern();String s3 = "Welcome to Java";System.out.println(s0 == s1);System.out.println(s0 == s2);System.out.println(s0 == s3);

结果为:
false
true
true

"=="对于指向类的变量是通过比较首地址来判断是否相同的,而s0是直接指向"Welcome to Java"这个字符串常量的字符串变量,而s1是通过先建立一个指向"Welcome to Java"常量的变量,然后再将s1指向该变量。
这样自然s0和s1的首地址是不同的。
而对于String类中的intern()方法,返回的是拥有相同内容字符串的规范化字符串,即返回的是这个这个内容的字符串常量的首地址。
所以s0和s2的首地址相同。

因此,我们推荐使用简化声明方式来声明字符串。

StringBuffer类

如果说String类是只读操作的话,StringBuffer就支持读写操作。
对于其中的三个函数,这里做一下说明。

*+capacity():返回的是当前所分配给这个对象的“容量”,这个容量是可扩展的,即随着对象增大,容量会自动扩充。缺省值为16,每次扩充为:new_capacity =(old_capacity + 1)* 2 ;*
+length():返回的是当前这个字符串实际上存储的字符个数;
二者的返回值一定满足:length() <= capacity()
+setLength():设置字符串的length()的大小,如果new_length < old_length,则会保留考前的字符;如果new_length > old_length,则会在元字符串末尾增加若干'\u0000';

如果一个字符串不需要任何更改操作的话,尽量使用String类,因为JAVA会对于String进行一些优化。


StringTokenizer类和Scanner类:

封装在java.util.*中,主要作为工具类,用于检索和处理信息的。
可以自行了解,这里不做详细描述。









NOTES:
*其实在类的内层实现中,还是以字符数组的形式进行维护。
*简化声明方式:这种方式和之前的方式有细微的差别,在规范化字符串一节中会发现不同之处。
*此后引入这种描述对象成员的方式(UML):+表示public,-表示private,_表示static。
*在内层实现中,使用一个更大的字符数组来替换原先的字符数组。

0 0
原创粉丝点击