1.String:

 /** Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared.
* 字符串是不变的,他们的值在创造后不能改变。
* 字符串缓冲区支持可变字符串,因为字符串对象是不可变的,所以它们可以共享。
*
* @see StringBuffer
* @see StringBuilder
* @see Charset
* @since 1.0
*/
public final class String implements Serializable, Comparable<String>, CharSequence {
private static final long serialVersionUID = -6849794470754667710L;
private static final char REPLACEMENT_CHAR = (char) 0xfffd;

  这个是经是用的也是最早接触的,但是它的一大优点就是生成一个字符串如果下一次再创建相同的,则直接指向常量区里已经生成过的那个。

  其他的先不讲这个东西的优点就是省资源,至于String类的另一个特点就是它是final修饰的也就是说不可被继承的。(网上还说它是线程安全的这个我面试的时候是         没想到)。

2.StringBuffer:

 public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, Appendable, CharSequence
{
/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}
public synchronized StringBuffer append(int i) {
super.append(i);
return this;
}
public synchronized StringBuffer delete(int start, int end) {
super.delete(start, end);
return this;
}
}
  synchronized这个的出现就直接知道这个小东西是线程的安全的了。(经常会问是不是线程安全的,看一下代码记得快)。

 3.StringBuilder:
 public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, Appendable, CharSequence {
public StringBuilder() {
super(16);
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
public StringBuilder delete(int start, int end) {
super.delete(start, end);
return this;
}
}

    他可以看成是StringBuffer的无synchronized版,线程不安全。

4.三者之间的区别:

  4.1:String VS StringBuffer

    4.1.1 初始化:

      4.1.1.1String的初始化:

      String a = null;

      String a="asd";

        4.1.1.2 StringBuffer的初始化

       StringBuffer a = null; //结果警告:Null pointer access: The variable result can only be null at this location

      StringBuffer a = new StringBuffer();//通过,这个是创建了一个空对象

      StringBuffer a = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象

    4.1.2  效率方面

  

 //String效率是远要比StringBuffer快的:
String S = “a” + “ s” + “ d”;
StringBuffer Sb = new StringBuilder(“a”).append(“s”).append(“ d”);

    4.1.3 执行速度方面

//String速度是非常慢的:
String S1 = “a”;
String S2 = “ s”;
String S3 = “ d”;
String S4 = S1 +S2 + S3;

       String对象不可变,重复新建对象需要花费很多时间;StringBuffer对象可变所以在插入删除方面有着很好的优势。

     PS: 注意在开头的代码可以看出StringBuilder与StringBuffer的区别在于方法的同步关键字的添加与否,所以效率与执行速度String与StringBuilder的比较                          是可以和上面String与StringBuffer比较做参照的。当然在初始化的方面同样可以。

     4.1.4 总结

      少量数据的操作为了追求效率可以用String;

      大量数据的拼接,插入,删除则建议使用StringBuffer;

  4.2 StringBuffer  VS StringBuilder

    4.2.1 线程安全

      这是这块知识最容易记住的,从上面的代码中就可看出StringBuffer是线程安全的,而StringBuilder是非线程安全的。

    4.2.2 执行速度

      在不考虑线程安全的情况下(单线程),StringBuilder的执行速度是快于StringBuffer,而且在大量的数据(这里指String字符串)需要进行插入,删除,       拼接的是执行速度也是远快于String的。

5 总结

  a.如果要操作少量的数据用 String; 
  b.多线程操作字符串缓冲区下操作大量数据 StringBuffer; 
  c.单线程操作字符串缓冲区下操作大量数据 StringBuilder。

面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别的更多相关文章

  1. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  2. 关于String StringBuffer StringBuilder

    0. String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...

  3. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  4. String StringBuffer StringBuilder (转)

    转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...

  5. final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?

    继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...

  6. 转:String StringBuffer StringBuilder区别

    转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...

  7. String&StringBuffer&StringBuilder区别

    String  String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式:    (1)直接赋值(例中,String str = &q ...

  8. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  9. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

随机推荐

  1. dedecms 在php5.4以上环境下 无法保存中文

    dedecms gbk版本在php5.4以上环境下 无法保存中文 原因在于5.4.0对这个函数的变化:htmlspecialchars5.4.0   The default value for the ...

  2. Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher a ...

  3. DataTable复制数据,深度复制

    /**/ /// <summary> /// 复制数据,深度复制 /// </summary> /// <param name="dataSourceRow&q ...

  4. OpenStack_I版 6.Neutron部署

    Neutron是不能自己创建网络的,它需要借助插件才能创建虚拟网桥.网卡 依赖插件 配置ml2为核心插件 本次网络模型采用扁平化网络,不同的网络类型不同的配置,不同的使用方法 打开安全组功能 Linu ...

  5. 关于C#委托的一些学习笔记

    1.什么是委托就是把方法作为参数传给另一个方法.委托说指向的函数,必须和函数具有相同的签名(返回值和参数类型) Public delegate void DelSayHi(string name); ...

  6. 下拉框的change事件

    6.1,获取下拉框的值(html标签中没有onchange事件的) <script language="javascript"> $(document).ready(f ...

  7. 升级adb注意事项

    最近使用adb devices老提示设备offline,百度试了好多方法都不行,后面才发现是因为没有把adb文件的名称中含有adb的所有文件复制到 c:/windows/system目录,复制完后只记 ...

  8. Excel VBA TextBox控件的滚动条不能刷新

    问题:Excel中Textbox控件以及Form里的Textbox控件,当直接填充的内容很长时,滚动条不能实时刷新. 现象: 修改后: 原因: 虽然已经向Textbox的Text里设置了内容,但此时T ...

  9. java 的几种引用

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 本章前文介绍的引用实际上都是强引用, ...

  10. Python Cookbook(第3版)中文版:15.15 C字符串转换为Python字符串

    15.15 C字符串转换为Python字符串¶ 问题¶ 怎样将C中的字符串转换为Python字节或一个字符串对象? 解决方案¶ C字符串使用一对 char * 和 int 来表示, 你需要决定字符串到 ...