String StringBuffer StringBuild三者的区别

String StringBuffer StringBuild三者的区别

一、String类是什么

  1. String类
    java.lang.String类代表不可变的字符序列
    "xxx"为该类的一个对象
    String类属于字符串类型,是引用类型。
    String类常见的构造方法:
String(String original)//创建一个String对象为original的拷贝
String(char[] value)//用一个字符数组创建一个String对象
String(char[] value,int offet,int count)//用一个字符数组从offset项开始的count个字符序列创建一个String对象
  1. String 类常用的方法
public char charAt(int index)//返回字符串中第index个字符
public int length()//返回字符串的长度
public int indexOf(String str)//返回字符串中出现str的第一个位置
public int indexOf(String str,int fromIndex)//返回字符串中从fromIndex开始出现str的第一个位置
public boolean equalIgnoreCase(String another)//比较字符串与another是否一样(忽略大小写)
public String replace(char oldChar,char newChar)//在字符串中用newChar字符替换oldChar字符
public boolean startWith(String prefix)//判断字符串是否以prefix字符串开头
public boolean endsWith(String suffix)//判断字符串是否以suffix字符串结尾
public String toUpperCase()//返回一个字符串为该字符串的大写形式
public  String toLowerCase//返回一个字符串为该字符串的小写形式
public String subString (int beginIndex)//返回该字符串从beginIndex开始到结尾的子字符串
public String subString(int beginIndex,int endIndex)//返回该字符串从begin开始到endIndex结尾的字符串
public String trim()//返回将该字符串去掉开头和结尾空格后的字符串
public static String valueOf(...)//将基本类型数据转换为字符串
public String[] split(String regex)//将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组。

二、StringBuffer类是什么

  1. java.lang.StringBuffer代表可变的字符序列
  2. String buffer和String类似,但StringBuffer可以对其字符串进行改变。
  3. StringBuffer类常用构造方法有:
StringBuffer()//创建一个不包含字符序列的“空”的StringBuffer对象
stringBuffer(String str)//创建一个StringBuffer对象,包含与String对象str相同的字符序列
  1. 添加,重载方法public StringBuffer append(…)可以为该StringBuffer对象添加字符序列,返回添加后的该StringBuffer对象引用,例如:
public StringBuffer append(String str)//添加一个字符串
public StringBUffer append(StringBuffer sbuf)//添加StringBuffer字符串
public StringBuffer append(char[] str)//添加一个字符数组
public StringBuffer append(char[] str, int offset,int len)//添加一个字符数组的一部分
public StringBuffer append(double d)//把double类型转换成字符串添加到后面
public StringBuffer append(Object obj)//添加一个对象到StringBuffer
  1. 插入,重载方法public StringBuffer insert(…)可以为该StringBuffer对象在指定位置插入字符序列,返回修改后的该StringBuffer对象引用,例如:
public StringBuffer insert(int offset,String str)//从offset位置插入
public StringBuffer insert(int ooset,double d)//把double的转换成字符串再插入进去
  1. 删除,方法public StringBuffer delete(int start,int end)可以删除从start开始到end-1为止的一段字符序列,返回修改后的该StringBuffer对象引用。
  2. 和String类相似的方法
public int indexOf(String str)
public int indexOf(String str,int fromIndex)
public StringsubString(int start)
public String subString(int start,int end)
public int length()
  1. 方法public StringBuffer reverse()用于将字符序列逆序,然后返回修改后的该StringBuffer对象的引用。

三、StringBuild是什么

和StringBuffer类似,常用方法也类似,这里不再赘述。

四、三者的区别是什么

  1. 执行速度 StringBuilder > StringBuffer > String,原因:
     String:字符串常量 
     StringBuffer:字符串变量
     StringBuilder:字符串变量

从上面的名字可以看到,String是“字符串常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:

String s = "abcd";
s = s + 1;
System.out.print(s); //result : abcd1

我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s,执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多低。

而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一个新的对象进行操作了,当然速度就快了。

举个的例子:

String str = “This is only a” + “ simple” + “ test”;
StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:

String str = “This is only a” + “ simple” + “test”;

其实就是:

String str = “This is only a simple test”;

所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,比如:

String str2 = “This is only a”;

String str3 = “ simple”;

String str4 = “ test”;

String str1 = str2 +str3 + str4;

这时候JVM会规规矩矩的按照原来的方式去做。

  1. 线程安全 StringBuilder与 StringBuffer
    StringBuffer:线程安全的
    StringBuilder:线程非安全的

    当我们在字符串缓冲去被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

  2. 总结
    如果要操作少量的数据用String
    单线程操作字符串缓冲区下操作大量数据用StringBuilder
    多线程操作字符串缓冲区下操作大量数据 用StringBuffer

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值