由于笔试面试经常会问到这个问题,所以在这里先把这些问题搞清楚。

String:自JDK1.0开始即有,源码中对String的描述:

  "Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings."

由此我们可知String是常量,一个String对象一旦被创建它的值就不能改变,所以如果你创建了一个String对象,然后改变了它的值,实际上是指,你创建了两个String对象。然后把引用指向你新创建的String对象。

从这里我们可以得知:如果你要经常改变一个字符串的值,最好不要用String类,因为每改变一次就创造一个新的对象,然后旧的对象不仅占用着内存,并且还没有被用到,这样会造成内存的极大浪费,从而对程序的性能造成影响。当然这些无引用的对象最终会被JVM的GC机制所回收。

StringBuffer:自JDK1.0开始即有,源码中对StringBuffer的描述:

  "A thread-safe, mutable sequence of characters. " 一个线程安全的,可变的字符串序列

所以,StringBuffer是线程安全的,它的内容可变的变量。尽管它的内部也是用字符串数组来存储字符串的值,但是它和String在构造方法上面有所不同:

String的无参构造方法:

public String() {
this.offset = 0;
this.count = 0;
this.value = new char[0];
}

StringBuffer的无参构造方法:

public StringBuffer() {
super(16);
} AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

其中StringBuffer继承了AbstractStringBuilder,并调用AbstractStringBuilder的构造方法,这里,我们可以知道,它先预留了16个字节的空间。而String则没有预留空间。

况且,StringBuffer还可以指定初始预留的空间大小。

再来看含参构造方法

String:

public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
// The array representing the String is bigger than the new
// String itself. Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}

StringBuffer的构造方法:

 public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}

而append方法则调用父类AbstractStringBuilder的append方法,这个方法是线程安全的,这里不再贴源代码,顺便说一句,StringBuilder和StringBuffer之间的区别就是:一个是线程安全的,一个不是线程安全的,他们的append方法都是调用AbstractStringBuilder的append方法,但是,请看:

StringBuffer的append:

public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}

StringBuilder的append:

 public StringBuilder append(String str) {
super.append(str);
return this;
}

而两者的super.append(str)均为:

 public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
if (len == 0) return this;
int newCount = count + len;
if (newCount > value.length)
expandCapacity(newCount);
str.getChars(0, len, value, count);
count = newCount;
return this;
}

由于我们主要是讨论区别,具体append的解释就不说了,大家可以自身查看源代码。

StringBuilder:自JDK1.5之后才有。

源代码中的描述:"A mutable sequence of characters. This class provides an API compatible

 with <code>StringBuffer</code>, but with no guarantee of synchronization.

"

它和StringBuffer的API是兼容的,但是不保证同步。

所以,综上所述,我们可以得出结论:在多线程条件下,如果对字符串的同步性要求严格,而且字符串经常改变,则应该用StringBuffer较为合理,而StringBuilder则比较适用于对同步性要求不那么严格,并且字符串经常要改变的程序中。如果该字符串几百年不用改变一次,那么肯定是用String比较合理了。

/** 原创作品,转载请注明出处,如发现本文中有任何错误或有不同看法,热烈欢迎评论交流^_^ **/

Java中String,StringBuffer,StringBuilder的区别及其使用的更多相关文章

  1. java中 String StringBuffer StringBuilder的区别

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

  2. java中String,StringBuffer,StringBuilder之间的区别

    文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...

  3. Java中String/StringBuffer/StringBuilder区别(转)

    1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuild ...

  4. java中String与StringBuilder的区别

    相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE ...

  5. java中string , StringBuffer , StringBuilder 区别

    1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这 ...

  6. 探秘Java中String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

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

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

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

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

  9. String,StringBuffer,StringBuilder的区别

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

  10. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...

随机推荐

  1. db2常用函数(1)

    VALUE函数 语法:VALUE(EXPRESSION1,EXPRESSION2) VALUE函数是用返回一个非空的值,当其第一个参数非空,直接返回该参数的值,如果第一个参数为空,则返回第一个参数的值 ...

  2. Hadoop之回收站

    一.回收站简介: 在HDFS里,删除文件时,不会真正的删除,其实是放入回收站/trash,回收站里的文件可以快速恢复. 可以设置一个时间阀值,当回收站里文件的存放时间超过这个阀值或是回收站被清空时,文 ...

  3. Word and MediaElement

    function jmc_new_lib(){// Because we still want the script to load but not the styleswp_enqueue_scri ...

  4. [已解决] java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.com.yourproject.test_jsp

    同事遇到了一个问题,开始项目运行的好好的,过了一段时间再访问页面会报出如下错误信息(只贴了部分), 这是为啥呢,可能是由于servlet-api版本jar包重复导致的,他项目本身使用了servlet- ...

  5. 新学习的语言Groovy

    什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用 ...

  6. poj-3259-wormholes-spfa-判负环

    题意:N个顶点, M条双向边, W条权值为负的单向边.求是否存在负环. 思路:首先你要懂bellman-ford或spfa..这是基础的spfa判断是否存在负环的题,存在负环的节点会重复入队(因为最短 ...

  7. 5.toogleButton以及Switch

    Switch现在用得更多,比toogleButton界面美观,用户体验也要好. 点击事件: 用isChecked来判断点击的是哪一个,然后做相对应的回应.

  8. fastjson和json-lib的区别

    上次把原生json替换成了fastjson,发生很多地方不兼容,对这个也做了一些总结: 1.对于没有赋值的变量处理,json-lib会根据类型给出相应初始值,而fastjson直接忽略这个字段. 解决 ...

  9. HashTable的实现原理

    转载:http://wiki.jikexueyuan.com/project/java-collection/hashtable.html 概述 和 HashMap 一样,Hashtable 也是一个 ...

  10. 项目文件中含有两个config文件,app.config与app1.config,如何获取app1.config中的配置

    想要通过配置文件配置C#前台画面,好奇做了以下测试:在项目中新建了app.config与app1.config两个配置文件,请教一下各位高手如果想从app1.config中读取配置信息应该如何读取?采 ...