分类: Java
2013-04-22 18:11:55
String vs StringBuffer
Java的String类已经相当完善,但之所以有StringBuffer类的出现是为了弥补String类在其特殊内存机制下在连接操作中出现的确定。
a) String的内存机制概括起来是“一次投入,终身回报”。JVM在运行时,将内存分为堆和栈,前者存放创建时的对象,后者存放方法调用过程中的局部变量或引用,而堆中又开辟了一块内存,称之为字符串常量池,用来存放特定的字符串对象。在创建字符串时,首先查看字符串常量池中是否存在内容相同的字符串独享,若没有,则新建一对象,否则用该引用指向该对象。由此,在字符串常量池中的字符串对象永远不变,当我们实际进行形如
a) String s1 = “a”;
b) String s2 = “b”;
c) s1 = s1 + s2;
的操作时,实际是将s2的内容追加到s1的内容组成新的内容,查找字符串常量池中是否存在与新内容相同的字符串,若有,则将s1引用指向该对象,否则新建之,再将s1指向新对象。由此带来一好处,不管字符串对象多长,其比较速度一样,但在一些大量需要连接字符串的代码中,其性能将大幅下降,因为其中创建了大量无用的中间对象,如:
a) String s =””;
b) For(int i = 0 ; i < 100; i++){
c) S = s + i ;
d) }
连接过程中出现很多中间对象,每执行一次连接操作便诞生一个新对象丢弃一个老对象,造成性能急剧下降。
b) StringBuffer在连接操作时,不产生冗余中间对象,但其创建语法只能通过new操作符进行创建,其append,insert,delete方法可以对StringBuffer对象进行指定操作,然后返回StringBuffer对象,通过toString返回字符串对象。