String,StringBuffer,StringBulider的区别

来源:互联网 发布:linux开源社区 编辑:程序博客网 时间:2024/05/16 09:37


http://blog.csdn.net/ximenghappy/article/details/6618892

String是固定长度的字符串,如果要发生变化必须重新生成新的实例;


常用方法:trim 去空格  append 后接字符串 indexOf 某个字符串的位置 charAt 返回某个下标位置的字符,insert 插入,endsWith 是否以什么结尾 startsWith是否以什么开始 lastIndexOf 最后一个以什么结尾的位置 firstIndexOf 最开始以什么开头的位置 toUpperCase 转换成大写 toLowerCase 换小写  substring 从原有的字符串截取哪到哪儿 等等toCharArray转数组,。equalsIgnoreCase对比忽略大小写


String 字符串常量 适合量少的
StringBuffer 字符串变量(线程安全)适合多线程
StringBuilder 字符串变量(非线程安全)适合单线程


安全耗费性能

不安全反倒快节约性能



简要的说, String 类型和 StringBuffer 类型的主要性能区别


表面上String可以改,其实是断开原有连接。重新new了一个String,然后重新连接;

其实在于 String 是不可变的对象,  而StringBuffer 和StringBuilder 是对自己操作。


一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做,


在大部分情况下 StringBuffer > String


StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。两者的方法基本相同。
 在Java语言体系中,用于声明变量的基本数据类型只有8种:boolean,char,byte,short,int,long,float,double。

与C/C++语言不同的是java中并没有把字符串作为一种基本的数据类型,而是在java.lang包中提供了处理字符串的类String,该类用于处理“不可变”的字符串;与之对应的还有,StringBuffer类用于处理“可变的”字符串。

注意:这两种类都被声明为final型,因此不可以被当做父类继承使用。

一、String类

由类String所创建的对象在创建之后是不可以更改的,被视为常量。

举例说明:

subString是String类中重要的处理字符串的方法

String str = "Hello world!";

Str = str.subString(6);

在上述语句中,str.subString(6);重新创建了一个字符串String对象,然后把这个对象赋值给str。

 

 

二、StringBuffer类

StringBuffer类是字符串缓冲区存储类,创建是可以更改长度的字符串对象,该字符串被视为常量,可以调用类方法改变字符串的长度和内容。

实现机理:创建对象时开辟一个缓冲区存放字符串序列,可以向字符串追加、插入操等作。在超过缓存区的容量时,java会自动扩大缓冲区的容量,保证操作的安全性。

 

 

三、StringBuilder类

StringBuilder类使用方法和StringBuffer类类似。

区别:StringBuffer类适用于多线程方法,StringBuilder类适用于单线程操作。StringBuilder对象的执行效率比StringBuffer对象要高。

StringBuilder是J2SE   5.0才新增的类,在J2SE   5.0之前的版本若有相同的需求,则使用java.lang.StringBuffer。事实上,StringBuilder被设计为与StringBuffer具有相同的操作接口。在单机非多线程(Multithread)的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。StringBuffer则会处理同步问题,如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。