String家族--String、StringBuffer、StringBuilder
2015-12-05 14:44
477 查看
一.String
1、String对象的初始化
由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:
String s = “abc”;
s = “Java语言”;
其实按照面向对象的标准语法,其格式应该为:
String s = new String(“abc”);
s = new String(“Java语言”);
只是按照面向对象的标准语法,在内存使用上存在比较大的浪费。例如String s = new String(“abc”);实际上创建了两个String对象,一个是”abc”对象,存储在常量空间中,一个是使用new关键字为对象s申请的空间。其它的构造方法的参数,可以参看String类的API文档。
2、String的连接
那么是不是可以根据这个结论推出使用"+"和StringBuilder的效果是一样的呢?这个要从两个方面来看。
如果从运行结果来解释,那么"+"和StringBuilder是完全等效的。但如果从运行效率和资源消耗方面看,那它们将存在很大的区别。
如果程序中频繁循环使用“+”,就会创建多个StringBuilder对象,虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。
二.StringBuffer StringBuilder
当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。
和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder类在Java 5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。
由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
1、String对象的初始化
由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:
String s = “abc”;
s = “Java语言”;
其实按照面向对象的标准语法,其格式应该为:
String s = new String(“abc”);
s = new String(“Java语言”);
只是按照面向对象的标准语法,在内存使用上存在比较大的浪费。例如String s = new String(“abc”);实际上创建了两个String对象,一个是”abc”对象,存储在常量空间中,一个是使用new关键字为对象s申请的空间。其它的构造方法的参数,可以参看String类的API文档。
2、String的连接
String s = "abc"; String ss = "ok" + s + "xyz" + 5;上述代码反编译后可以看到:
String ss = (new StringBuilder("ok")).append(s).append("xyz").append(5).toString();从上面的代码很容易看出,虽然在源程序中使用了"+",但在编译时仍然将"+"转换成StringBuilder。因此,我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。
那么是不是可以根据这个结论推出使用"+"和StringBuilder的效果是一样的呢?这个要从两个方面来看。
如果从运行结果来解释,那么"+"和StringBuilder是完全等效的。但如果从运行效率和资源消耗方面看,那它们将存在很大的区别。
如果程序中频繁循环使用“+”,就会创建多个StringBuilder对象,虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。
二.StringBuffer StringBuilder
当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。
和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder类在Java 5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。
由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
相关文章推荐
- (4)用DuiCreator的DuiLib类向导,加速多窗口程序制作
- 随意细解:UI -- KVO、图片异步下载
- android 蓝牙bluetooth 4.2.2搜索蓝牙功能实现
- CASIO 键盘 按键和 C# keycode keyvalue 值对应关系
- android 蓝牙Bluetooth 4.2.2打开蓝牙实现
- 检测到有潜在危险的 Request.Form 值
- [LeetCode]Implement Stack using Queues
- 使用UI Automation实现自动化测试 (InvokePattern)
- (译)如何自定义UIDocument的子类
- DDuilib入门【一】
- Ubuntu 15.10下android studio 1.5,新建android项目,gradle build running永不停止
- UIScrollView基本用法
- 第25篇 jQuer快速学习(上)---选择器和DOM操作
- 爬爬爬之路:UI(十五) KVO
- Code Forces 592 B. The Monster and the Squirrel(水~)
- android Bluetooth开发基本流程
- poj 1679 The Unique MST(次小生成树变形)
- ios_Cocoa框架 “Foundation”和“UIKit”的区别
- android Bluetooth的实现蓝牙操作
- UIView(包括子类)的几个初始化时执行动作的时机