本帖最后由 黄成超 于 2013-2-8 10:30 编辑
String主要特点归纳:
(1)不可变String
String对象是不可变的,每一次修改String的值,都会创建一个全新的String,以包含修改后的内容,比如:- public class Test1 {
- public static void main(String[] args) {
- String q = "howdy";
- System.out.println(q);//howdy
- String qq = upcase(q);
- System.out.println(qq);//HOWDY,也许这里的返回值不能说明q是否改变,因为返回值确实也可以先创建一个对象,用于保存临时String对象
- System.out.println(q);//howdy,但是通过打印q的值,就你能了解到q的值确实并未改变
- }
- /**
- * 写一个自定义的upcase方法,用于返回s转化为大写的结果
- *
- */
- public static String upcase(String s)
- {
- System.out.println(s.hashCode());
- return s.toUpperCase();
- }
复制代码 关于字符串的不可改变,jdk开发文档也有说明,同时因为String对象不可改变,所以可以共享,如:
String str = "abc";
等效于:
char[] data = {'a','b','c'};
String str = new String(data);
需要强调的是,字符串是常量,他们的值在创建之后不可变(这个jdk开发文档有说明),并不是说创建多个String对象,内存中只有一个,
不可改变,指的是原来的String的值不能改变。
因此:
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1==str2); //false
结果显然是false。
而字符串是常量,所以
String str3 = "abc";
String str4 = "abc";
System.out.println(str3==str4);//true
常量存放在常量池中,两个"abc"存放位置是相同的。这点要区别。
(2)String、StringBuffer、StringBuilder比较
String是java中的常用字符串对象,而StringBuffer,StringBuilder则是类似于String的字符串缓冲区。
String对象创建后不能修改,上面已有说明;
StringBuffer不能直接修改,但可以通过某些方法改变内容与长度,可安全的用于多线程
StringBuilder为可变字符序列,StringBuilder则用于多线程不安全,但相对更高效,所以除非在多线程,否则建议使用StringBuilder
StringBuffer,
(关于String,StringBuffer,StringBuilder以及类似单个类或对象方法的比较,建议查看jdk开发文档!)
(3)String的"+"、"+="
原来一直不是很清楚下面的到底创建了多少对象:
String s = "abc" + "addf" +"def" +47;
相信看完下面这个例题分析,了解String的底层创建过程,就能够清楚知道:- class StringTest
- {
- public static void main(String[] args)
- {
- String mango = "mango";
- String s = "abc" + mango +"def" +47;
- System.out.println(s);
- }
- }
复制代码 这段代码是怎么工作的呢?通过jdk自带的工具javap反编译这段代码,如下:
javap -c -StringTest
注意,反编译前一定要先编译哦!
通过反编译的图片可以知道,在运行的过程中编译器创建了一个StringBuilder对象,用以构造最终的String(使用StringBuilder,是因为StringBuilder更高效),并
为每个字符串调用一次append()方法,首先是将"abc"通过append方法放在StringBuilder中,然后使用append()用于包含"abc"与mango连接后的字符串
,然后再次调用append()方法,把def加入StringBuilder中,以此类推,总共4次。最后用toString方法,生成结果String对象(这个在jdk中也有说明)。
对于一些容易产生误解的知识点,可能还不够完整,希望大家都补充一下。。。。
参考《java编程思想》及jdk1.6开发文档以及自己总结及代码验证
|