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会大大提升性能
- String 、StringBuffer 和 StringBuilder
- String、StringBuffer和StringBuilder
- string和StringBuilder比较
- String和StringBuilder
- String、StringBuffer和StringBuilder
- String、StringBuffer和StringBuilder
- String和StringBuilder区别
- String和StringBuilder 区别
- StringBuilder和string区别
- StringBuilder和String区别
- string 和StringBuilder比较
- String、StringBuffer和StringBuilder
- String中的“+”和StringBuilder
- String Stringbuffer和StringBuilder
- string和stringBuilder区别
- string和stringBuilder区别
- string和stringBuilder区别
- StringBuilder和String
- 银行业务调度系统(Bank Business Dispatching System)
- hdu4300 KMP
- office2007 如何加密
- Java io将文本数据存储到一个文件中
- 数据结构之排序算法
- String和StringBuilder
- HDU 1716 排列2
- python读取中文字符问题
- java 关于封装jdbc操作接口的一些做法
- 关于单片机程序初始化硬件参数代码
- for 循环中奇怪的else
- 手动调整内核printk打印级别
- vi
- 调试中的团队合作反思