String、StringBuffer、StringBuilder的比较
看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的比较的更多相关文章
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- String,StringBuffer,StringBuilder的区别
public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...
- 关于String StringBuffer StringBuilder
0. String对象的创建 1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
- Java学习笔记--String StringBuffer StringBuilder
String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...
- String StringBuffer StringBuilder (转)
转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...
- 【Java基础】String StringBuffer StringBuilder
String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...
随机推荐
- Confluence 6 使用 JConsole 监控本地 Confluence
如果你遇到了一些特定的问题,或者你仅仅是希望在一个很短的时间内监控你 Confluence 的运行,你可以使用本地监控.本地监控将会对你的服务器性能产生影响,所以我们并不推荐你使用本地监控来长时间的监 ...
- Java的动手动脑(六)
日期:2018.11.8 星期四 博客期:022 --------------------------------------------------------------------------- ...
- Linux用户、用户组、文件权限学习笔记
最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识.学习这几样东西,得先掌握linux的权限系统相关知识.linux的权限系统主要是由用户.用户组和权限 ...
- Netty沾包和拆包
1.连着发两条,会沾在一起,这就是沾包 2.包尾添加特殊分隔符,接收方通过特殊分隔符切分报文区分,这就是拆包 在ChatServerInit类.ChatClientInit类分别加入以下代码 Byte ...
- python中range()函数的用法
python中range()函数可创建一个整数列表,一般用在for循环中. range()函数语法: range(start,stop[,step]) 参数说明: star: 计数从star开始.默认 ...
- JAVA之复制数组
//复制数组 //Arrays.copyOf(arr, 5) //arr:要复制的对象,5为新数组的长度 import java.util.Arrays; public class Cope { pu ...
- Memcached 快速入门
Memcached简介 Memcached是一个专门用来做缓存的服务器,而且缓存的数据都在内存中.Memcached就相当于一个Dictionary键值对集合,保存的是键值对,然后根据key取valu ...
- Ubuntu下VS Code 字体设置 + 标签匹配、括号匹配插件
Ubuntu下比较好看的字体有: Courier NewSource Code ProWenQuanYi Micro HeiWenQuanYi Micro Hei MonoUbuntuDroid Sa ...
- WPF:如何高速更新Model中的属性
原文:[WPF/MVVM] How to deal with fast changing properties In this article, I will describe a problem w ...
- url、querystring模块获取请求request.url中的不同部分图解
url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://loc ...