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

  (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. Android Studio 默认的快捷键

    参考资料: 1.http://stormzhang.com/devtools/2014/12/09/android-studio-tutorial3/ Action Mac OSX Win/Linux ...

  2. Linux删除乱码文件的方法

    当文件名为乱码的时候,无法通过键盘输入文件名,所以在终端下就不能直接利用rm,mv等命令管理文件了. 我们可以通过以下几种方法删除linux下的乱码文件.(文件名为乱码) l  方法1 我们知道每个文 ...

  3. android webview 加载本地html 实现 与 java 之间的相互响应

    1.布局 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:androi ...

  4. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

  5. 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序

    [BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...

  6. C++模板类[初步]

    /* * stacktp.h * * Created on: 2014年3月29日 * Author: */ /** * - 模板类的概念,与使用 * -# export template <c ...

  7. Hadoop伪分布式环境快速搭建

    Hadoop分支 Apache Cloudera Hortonworks 本文是采用Cloudera分支的hadoop. 下载cdh-5.3.6 版本 下载地址:http://archive.clou ...

  8. netstat命令简单使用

    1.适用范围 该命令用于打印网络连接.路由表.接口统计.伪装连接.多播成员等信息. (netstat已经过时,现在使用ss命令,所以本文不会作过多翻译,只着重一些重要部分) 2.语法概览 netsta ...

  9. Unicode Category

    Lu(letter,uppercase):大写字母. Ll(letter.lowercase):小写字母. Lt(letter,titlecase):词首字母大写的字母. Lm(letter,modi ...

  10. 函数创建XML文件

    REPORT  YTST_XML_14. *----------------------------------------------------------------------* * PANT ...