看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. Java的家庭记账本程序(F)

    日期:2019.2.17 博客期:034 星期日 我先配置了Android的相关环境,先试着做了Hello World的测试,但是却出现了很严重的问题,问题如下: Unable to get curr ...

  2. 1,环境的搭建,angular

    也是学习一些皮毛,只是把这些经验记录下来而已. 至于angular有什么好处,或者有什么是什么,我就不多做介绍,自己可以去百度,肯定能找到更为详细的. 我使用的是google提供的angualr-cl ...

  3. python网络爬虫笔记(九)

    4.1.1 urllib2 和urllib是两个不一样的模块 urllib2最简单的就是使用urllie2.urlopen函数使用如下 urllib2.urlopen(url[,data[,timeo ...

  4. 大明A+B

    大明A+B 时间限制: 1 Sec  内存限制: 32 MB 以内加法的那个"小明"了,现在他甚至会任意长度的正小数的加法.现在,给你两个正的小数A和B,你的任务是代表大明计算出A ...

  5. Linux基础一:Linux的安装及相关配置

    1. 计算机操作系统简介    1) 操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间.    2) 操作系统的内核的定义:操作系统的内核是一 ...

  6. Eclipse编写ExtJS5卡死问题

    本篇以eclipse为例,导入后在编译时很容易出现eclipse的卡死现象,这主要是js文件的校验引起的. 我们可通过如下方法进行配置: 打开该项目的.project文件,删除如下配置即可: < ...

  7. Spring Cloud Eureka简介及原理

    Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务 ...

  8. VS2017使用文档

    参考链接:https://docs.microsoft.com/zh-cn/visualstudio/debugger/?view=vs-2017

  9. [转] React风格的企业前端技术

    亲爱的各位朋友们,大家下午好! 首先祝大家国庆节快乐! 很高兴可以在国庆前夕,可以为大家分享一下React风格的企业前端技术. 谈到前端,可能以前大家的第一感觉就是,前端嘛,无非就是做做页面切图,顶多 ...

  10. Kettle Spoon入门教程

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.其中,Spoon是Kettle中的一个组件,其他组件有PAN,CHEF,Enc ...