看String类的定义:public final class String...{private final char value[];}

  看AbstractStringBuilder类的定义:abstract class AbstractStringBuilder...{char[] value;}

  PS:StringBuffer类和StringBuilder类都继承自AbstractStringBuilder类

  我们不难发现:在String类中有一个char类型的数组变量value,用final修饰说明大小不可变,用来存放String类型数据,实际字符串底层就是用字符数组来存储的;而在AbstractStringBuilder类中也有一个char类型的数组变量value,但是没有任何修饰,表示大小可变。

  直接上代码:

 package com.bjwyj.method;
/**
* 测试String、StringBuffer、StringBuilder的区别和联系
* @author 吴永吉
*
*/
public class TestString {
public static void main(String[] args) {
testString();
testStringBuffer();
testStringBuilder();
} /**
* 测试String对象的追加
*/
public static void testString() {
String str = "";
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++) {
str += i;
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
} /**
* 测试StringBuffer对象的追加
*/
public static void testStringBuffer() {
StringBuffer sbuf = new StringBuffer();
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++) {
sbuf.append(i);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
} /**
* 测试StringBuilder对象的追加
*/
public static void testStringBuilder() {
StringBuilder sbud = new StringBuilder();
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++) {
sbud.append(i);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
}

  测试结果:

422
15
0

  从测试结果可以看出:同样是循环10000次的追加操作,结果却大不相同。String类每次追加字符串都会创建新的对象,消耗的时间最长,性能极差。而StringBuffer和StringBuilder每次追加字符串都是同一个对象,消耗的时间极短,性能良好。而StringBuffer比StringBuilder消耗的时间稍长一点点,原因是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以StringBuffer相比StringBuilder性能稍差一点点。

  总结:

  (1)String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。

  (2)StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setCharAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String。

  (3)JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder。

String、StringBuffer、StringBuilder的比较的更多相关文章

  1. java中 String StringBuffer StringBuilder的区别

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

  2. String,StringBuffer,StringBuilder的区别

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

  3. 关于String StringBuffer StringBuilder

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

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

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

  5. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...

  6. String StringBuffer StringBuilder (转)

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

  7. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

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

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

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

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

  10. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

随机推荐

  1. Confluence 6 附件存储配置

    在默认的情况下 Confluence 的附件存储在 home 目录中(例如,在文件系统). 希望对 Confluence 的附件存储进行配置: 在屏幕的右上角单击 控制台按钮 ,然后选择 Genera ...

  2. bzoj 2150

    然后考虑正解 我们发现,最坏情况就是每个点都派驻军队,所以答案至多是“.”的数目 而且,每个点都至多只有一个入度和一个出度,所以我们可以将每个点拆成两个点,一个作为入点,一个作为出点,然后所有图上能到 ...

  3. Java 产生一个大于等于200,小于300的随机数,且是10的整数倍

    public class Random200_300 { public static void main(String[] args) { int r1 = 0; while (true) { r1 ...

  4. spring cloud config--client

    概述 之前我们简单的搭建了一个单点的config-server服务,实现配置文件的统一管理,本次文章将实现config-client是如何从config-server中获取到统一配置文件信息的 1.创 ...

  5. JS判断元素 动画是否执行完成

    使用animationend方法 var ele = document.getElementById("box"); ele.addEventListener("anim ...

  6. 论文阅读笔记十七:RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation(CVPR2017)

    论文源址:https://arxiv.org/abs/1611.06612 tensorflow代码:https://github.com/eragonruan/refinenet-image-seg ...

  7. Python内置模块之random

    random的方法有 random.random # 返回一个随机的小数 ramdom.uniform # 按照一个区间返回一个小数 random.randint # 返回一个整数 random.ra ...

  8. java 学习中出过的错误

    1. 运行异常 C:\Users\plan-B\java>java TapeDeckTestDrive.class 错误: 找不到或无法加载主类 TapeDeckTestDrive.class

  9. HDU 1247 Hat’s Words(字典树活用)

    Hat's Words Time Limit : 2000 / 1000 MS(Java / Others)    Memory Limit : 65536 / 32768 K(Java / Othe ...

  10. Python中的日志处理

    在日常项目中,总是需要记录下一些细小信息或者错误码.错误信息的,这个时候就需要进行日志的操作.python中用于日志创建.设置和记录等功能的模块,就是logging了,下面是对其基本使用方法的介绍: ...