一.谈谈三者在实现上的区别。

  (1)先看String 方法,实现了Serializable, Comparable, CharSequence三个接口

package java.lang;

import java.io.*;
import java.nio.charset.Charset;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public final class String
implements Serializable, Comparable, CharSequence
{
private static class CaseInsensitiveComparator
implements Comparator, Serializable
{ public int compare(String s, String s1)
{

 其次看一下StringBuffer和StringBuilder

package java.lang;
import java.io.*;
public final class StringBuffer extends AbstractStringBuilder
implements Serializable, CharSequence
{
package java.lang;
import java.io.*;
public final class StringBuilder extends AbstractStringBuilder
implements Serializable, CharSequence
{

可以很明显的看出String 和StringBuffer,StringBuilder有相对较大的区别,实时也是如此。StringBuffer,StringBuilder几乎一样,StringBuffer就是里面做了一些synchronized 修饰,从保证线程安全的。StringBuffer,StringBuilder继承了AbstractStringBuilder,实际上AbstractStringBuilder实现了Appendable, CharSequence这两个接口,从而也可在继承和实现的看出区别,三个共同实现了Serializable,CharSequence。而String 实现的有Comparable,则String 和StringBuffer实现Appendable。

二.谈谈三者效率区别。

先用三组数据来看看

 package com;
public class test {
public static void main(String[] args) { //String
long i = System.currentTimeMillis();
String st = "";
for(int j = 0;j<100000;j++){
st="aaa"+"bbb"+"ccc";
}
long i1 = System.currentTimeMillis();
System.out.println(i1-i); //String
long s1 = System.currentTimeMillis();
String st1 = "aaa";
String st2 = "bbb";
String st3 = "ccc";
String st4 = ""; for(int j = 0;j<100000;j++){
st4=st1+st2+st3;
}
long s2 = System.currentTimeMillis();
System.out.println(s2-s1); //StringBuffer
long i2 = System.currentTimeMillis();
String st5 = "ddd";
StringBuffer sb = new StringBuffer();
for(int j = 0;j<100000;j++){
sb=sb.append(st5);
}
long i3 = System.currentTimeMillis();
System.out.println(i3-i2);
} }

以上的执行结果   1  16   4   单位是ms

以上做了String,StringBuilder的比较的,因为StringBuilder,StringBuffer几乎差不多。

首先看两次的Stirng执行效率,1  16 效率差距还是蛮大的,虽然实现效果一样,但是真正的实现时候,前一个并没有做创建,然后再做“+”这个操作,而是再文件编译阶段,就已经将完成"aaa"+"bbb"+"ccc"操作,将"aaabbbccc"当做一个字符串常量放到常量区,而100000对赋值仅仅是去字符串对象地址取出便可,这个取得效率是很高的。但是后者却是实实在在的创建了100000此对象,然后又做了相同次数+运算,赋值这个步骤和前者时间差不多的,真的耗时就在创建和+这两个步骤了,有大量对象就会需要GC来处理。因此为了提高效率,尽量避免创建对象。

其次咱们来看看Sting 和 StringBuilder这两个的执行效率,16  4 同样是拼接了100000次,时间相差不可谓不小,从结果上来看可以很明显得出 大量字符串拼接时候,StringBuffer的append()效率要远远好于String对象+连接。原因也很简单,String 做拼接的时候他的value[]不能改变,每次操作都需要创建新的对象,而StringBuffer得value[]是可以变得,只是扩大即可,所以效率会好很多。

StringBuilder,StringBuffer的效率差不多,而StringBuffer支持多线程,所以相对来说StringBuilder比StringBuffer稍好点。

有什么疑问欢迎留言探讨。

谈String,StringBuilder,StringBuffer随笔的更多相关文章

  1. 浅谈String、StringBuffer与StringBuilder

    浅谈String.StringBuffer与StringBuilder   先详细介绍一下String.StringBuffer与StringBuilder String: 官方对String的说明: ...

  2. 深入源码剖析String,StringBuilder,StringBuffer

    [String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...

  3. String, StringBuilder, StringBuffer问题

    1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...

  4. String StringBuilder StringBuffer区别

    String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...

  5. difference among String,StringBuilder,StringBuffer

    difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...

  6. JDK源码分析系列---String,StringBuilder,StringBuffer

    JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...

  7. java中String StringBuilder StringBuffer比较和效率(性能)测试

    string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...

  8. string,stringbuilder,stringbuffer用法

    总结:1.如果要操作少量的数据用 = String   ==================================>字符串常量2.单线程操作字符串缓冲区 下操作大量数据 = Strin ...

  9. java中string stringbuilder stringbuffer 的区别

    1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...

随机推荐

  1. 读取Excel中的数据到DataSet

    读取Excel中的数据到DataSet 1.引用命名空间 using System.Data.OleDb; 2.输入Excel文件,输出DataSet public DataSet ExecleDs( ...

  2. 嵌入式数据库H2的安装与配置

    一.配置JAVA环境 1.首先检查系统是否自带JDK 使用命令:#java -version 没有信息即为没有安装,如有且版本较低,可采用如下方式卸载: 查看命令: rpm -qa | grep ja ...

  3. horizontalDragMaxWidth:0;就没有水平滚动条了

    jquery.jscrollpane.css JScrollPane工作所必须的基本的CSS样式.jquery.min.jsjQuery作为javascript库必须提前引入.jquery.mouse ...

  4. Laravel开发:Laravel核心——Ioc服务容器源码解析(服务器绑定)

    服务容器的绑定 bind 绑定 bind 绑定是服务容器最常用的绑定方式,在 上一篇文章中我们讨论过,bind 的绑定有三种: 绑定自身 绑定闭包 绑定接口 今天,我们这篇文章主要从源码上讲解 Ioc ...

  5. WebView中打开相机,文件选择器的问题和解决方法

    近几年前端开发真是越来越火,H5页面开发的移动端页面甚至有夺我原生开发半壁江山的意思,忧伤忧伤.不过从实际情况考虑,H5一套代码到处跑的特性,我们的Android, IOS ...也就只能呵呵了.然而 ...

  6. Spring标签@Aspect-实现面向方向编程(@Aspect的多数据源自动加载)——SKY

    从Spring 2.0开始,可以使用基于schema及@AspectJ的方式来实现AOP.由于@Aspect是基于注解的,因此要求支持注解的5.0版本以上的JDK. 环境要求:    1. mybit ...

  7. 什么是Mocking framework?它有什么用?(转)

    今天我想讲下关于mocking frameworks,并且解释下他为什么有用处.我将给你们展示用和不用mocking framework两种测试方法. 假设我们已经有了一个Driver类: publi ...

  8. ASP向上取整

    <%Function Ceil(value)    Dim return    return = int(value)    Cei2=value-return    if Cei2>0 ...

  9. Java找出一组数字的最大值

    形如:int [] nums = {7,2,8,9,1,12}; 解一:两两比较并记录下标,下次比较拿上次比较的最大值和上次比较的下一个进行比较,循环一次找出最大值 /** * @author 马向峰 ...

  10. Apache Shiro 使用手册(四)Realm 实现(转发:http://kdboy.iteye.com/blog/1169631)

    在认证.授权内部实现机制中都有提到,最终处理都将交给Real进行处理.因为在Shiro中,最终是通过Realm来获取应用程序中的用户.角色及权限信息的.通常情况下,在Realm中会直接从我们的数据源中 ...