Java中String三种加法的区别
来源:互联网 发布:pg dump 备份数据库 编辑:程序博客网 时间:2024/06/07 18:15
java它提供了如此丰富的library,让程序员能够很容易的写出功能强大的程序。同时它也封装了如此多的细节,让程序员能够轻易的写出很拙劣的程序。它所代表的object指向思想设计之初是为了把程序员从纷繁复杂的编程细节中解放出来,来达到对已有程序的利用。但是在编程实际上又要求程序员了解其实现的细节,而避免写出因调用已有library不正引起的performance慢的、耗费系统资源多的程序。通常成为一个优秀的Java程序员需要较长时间的经验积累,包括从程序的tuning中或从其他有经验的程序员口中,才知道一定功能需要怎样实现,在程序中需要避免那些问题。但这往往是比较片面的,知其然而不知其所以然。我想大多数程序员都有类似的经历,举一个简单的例子,下面有三种对String的累加操作。
①String tmp = "a" + "b" + "c";
②String tmp = null;
tmp+= "a";
tmp+= "b";
tmp+= "c";
③String tmp = null;
StringBuffer buf = new StringBuffer();
buf.append("a");
buf.append("b");
buf.append("c");
tmp = buf.toString();
有些Java程序员在任意的用这三种方法的任一种,无视它们的区别。有些程序员知道第三种方法好,一直在用而不知其为什么好,以至于作为经验教条的传授给Java新手。真正的答案是什么呢?让我们揭开Java String Class和StringBuffer Class的封装面纱,看看它的内部实现。在Java中的String Class是一个不可变类,所有对一个Sting Object的改变都会导致一个新的String Object的生成。那么对tmp+=a中+符号的实现呢?
如果你注意一下StringBuffer的Javadoc会发现,JDK对它的实现是:tmp=(new StringBuffer()。append(tmp)。append("a"))。toSting();这样我们发现②这种方法在隐性生成了一个StringBuffer Object和一个String Object 再乘3就是六个object 的资源耗费。(还不包括String Class和StringBuffer Class内部使用的Char[])。而方法③只用了两个。也许有些程序员会对这些耗费不以为然,的确也是,不过在一些场景下它会成为perfamence的瓶颈。再回头看看①这种方法,它会被Java编译器编译为:tmp=(new StringBuffer()。append("a")。append("b")。append("c"))。to String();我们发现做的和③方法是同样的事。
①String tmp = "a" + "b" + "c";
②String tmp = null;
tmp+= "a";
tmp+= "b";
tmp+= "c";
③String tmp = null;
StringBuffer buf = new StringBuffer();
buf.append("a");
buf.append("b");
buf.append("c");
tmp = buf.toString();
有些Java程序员在任意的用这三种方法的任一种,无视它们的区别。有些程序员知道第三种方法好,一直在用而不知其为什么好,以至于作为经验教条的传授给Java新手。真正的答案是什么呢?让我们揭开Java String Class和StringBuffer Class的封装面纱,看看它的内部实现。在Java中的String Class是一个不可变类,所有对一个Sting Object的改变都会导致一个新的String Object的生成。那么对tmp+=a中+符号的实现呢?
如果你注意一下StringBuffer的Javadoc会发现,JDK对它的实现是:tmp=(new StringBuffer()。append(tmp)。append("a"))。toSting();这样我们发现②这种方法在隐性生成了一个StringBuffer Object和一个String Object 再乘3就是六个object 的资源耗费。(还不包括String Class和StringBuffer Class内部使用的Char[])。而方法③只用了两个。也许有些程序员会对这些耗费不以为然,的确也是,不过在一些场景下它会成为perfamence的瓶颈。再回头看看①这种方法,它会被Java编译器编译为:tmp=(new StringBuffer()。append("a")。append("b")。append("c"))。to String();我们发现做的和③方法是同样的事。
0 0
- Java中String三种加法的区别
- Java中String三种加法的区别
- 讨论java String中三种加法的区别
- String中三种加法的区别
- 讨论Java的String中三种加法的区别
- Java入门--String中三种加法的区别
- Java 中 String的三种判断方式NotEmpty,NotNull和@NotBlank的区别
- JAVA中int转String的三种方法
- 26-java中int转string的三种方法
- JAVA中String与StringBuffer的区别
- JAVA中String与StringBuffer的区别
- JAVA中String和StringBuffer的区别
- Java中String和StringBuffer的区别
- JAVA中String与StringBuffer的区别
- JAVA中String与StringBuffer的区别
- java中String与StringBuffer的区别
- Java中String 和StringBuffer的区别?
- java中String和StringBuffer的区别
- 春节前,为了..所以就记录一下
- primeFaces 日历控件<p:calendar> 防止编辑功能使用小结
- Android spannableStringBuilder用法整理
- 根据接口名字查询系统中所有的实现类
- eclipse实现hibernate相关xml文件自动提示
- Java中String三种加法的区别
- 梵蒂冈申购费搞的鬼桂丰大厦
- 安卓工具类------->跟网络相关的工具类
- 蓝牙使用到的UUID
- Cocos2d-x 3.2编写常用UI组件(四)发光的标题BlinkTitile
- 探秘!人们在死前是什么感觉?!
- BBB服务关系架构概述图
- 啊谁发的发打饭的生风发顺丰
- 固体表和DUAL表的介绍