看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. ios 输入框问题

    去除ios输入框阴影 input,textarea{-webkit-appearance:none; outline: none; } ios有边框时设置boder-radius:0: 去除默认圆角问 ...

  2. vuejs项目---配置理解:

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面  (环境变量及其基本变量的配置) 1 2 3 4 5 6 7 8 9 10 11 12 ...

  3. Mycat实现mysql主从复制(读写分离)

    数据库性能瓶颈主要原因: 随着用户数的增多,带来的是数据库连接的大幅度增长 随着业务体量的增长,表数据量(空间存储的问题)的大幅增长,其中涉及到索引的优化,mysql默认的索引是硬盘级别的,BTREE ...

  4. 【python】threadpool的内存占用问题

    先说结论: 在使用多线程时,不要使用threadpool,应该使用threading, 尤其是数据量大的情况.因为threadpool会导致严重的内存占用问题! 对比threading和threadp ...

  5. 【supervisor】监控服务

    写了一个ftp服务,用supervisor监控一下 1.先写一个配置文件,路径和名称为/etc/supervisord.conf.d/ftp-server.ini [program:ftp-serve ...

  6. 【ES】学习12-近似聚合

    在数据操作中有三个考虑指标:大数据.精确性和实时性.三者难以同时满足. 精确 + 实时 数据可以存入单台机器的内存之中,我们可以随心所欲,使用任何想用的算法.结果会 100% 精确,响应会相对快速. ...

  7. C#概念总结(二)

    1.C#的方法:<access Specifier>  <Return Type>< Method Name>(Parmeter list){     method ...

  8. java常用的中间件

    tomcatWeblogicJBOSSColdfusionWebsphereGlassFish 一般本地开发的话建议使用tomcat. linux系统建议使用jetty或apache hpptd 大型 ...

  9. axure交互样式(下拉列表和矩形)

    *****矩形交互样式之单选按钮*****1.账号输入框.密码输入框等文本框实现效果:输入框获取焦点时边框是蓝色,失 去焦点时边框为红色: 2.实现思路:边框用矩形来设置选中和未选中.禁用和启用即可 ...

  10. django linux环境部署

    一.操作环境: 1操作系统:Ctrip-CentOS-7.1-x86_64-R3 Python版本:2.7.5 Django版本: Django 1.8.19 (LTS) 二.部署流程 pip ins ...