String和StringBuilder

来源:互联网 发布:手机重低音软件 编辑:程序博客网 时间:2024/06/03 21:58

今天翻书简单看了看String对象,简单总结下面:

Java中String类型是final的,不可以被继承,其对象是不可变的,每次对它的修改其实都是创建了一个全新的String对象,新的对象包含修改后的值,而原对象丝毫不变。

JavaString类型重载了两个操作符“+”、“+=”,这也是Java中仅有的两个重载操作符,Java不允许重载任何操作符。且看我们对字符串进行以上两个操作时是怎么实现的。

例:String s="aa"+"bb"+"cc";

我们来分析下这个操作后一共创建了多少个String对象,首先三个字符串已经创建了三个对象,根据上面描述String对象是不可变的,我们顺势分析是不是在aa和bb相加时创建了一个新的字符串和cc相加最后又创建了一个字符串,加起来一共创建了5个字符串呢?答案当时是错的,编译并没有这么傻,而是在底层做了优化,真正起作用的便是StringBuilder对象,在进行“+”操作时,编译器创建了一个StringBuilder对象(暂时叫做sd),在这个过程中sd.append("aa").append("bb").append("cc"),此处做了简化,它通过调用append方法将三个字符串连接起来,最后调用toString()方法返回一个String对象。

 

经过上述分析我们发现对字符串进行"+"操作时并没创建我们想象的那么多对象,但是我们也不能任意使用这个操作,编译器并不是万能的,下面一个例子便能说明原因

例如:String s="";

           String[] fields={"a","b","c"};

           for(String s1:fields){

                s+=s1;

          }

我们可以通过命令javap来看其JVM字节码,这个操作在每一次循环中都会创建一个StringBuilder对象然后重复前面的分析的过程。如若我们像下面那样在循环开始就创建一个StringBuilder对象就会减少对象创建次数,提高性能

 例如:StringBuilder s=new StringBuilder();

           String[] fields={"a","b","c"};

           for(String s1:fields){

                s.append(s1);

          }

总之虽然编译器会为我们做部分优化,但是也并没有那么智能,在进行简单的操作时我们可以不用显示的使用StringBuilder,若有些复杂的操作显示使用StringBuilder会大大提升性能

 

 

 

 

原创粉丝点击