文档章节

String,StringBuilder和StringBuffer类

laohng1995
 laohng1995
发布于 2016/04/07 18:03
字数 680
阅读 43
收藏 0

今天看了一会儿关于String的一类的书,大概了解了String,StringBuilder和Stringuffer的区别。下面我就来浅谈一下关于这三部分的差别。

public class Test {

        int loopCount = 10000; // 执行添加操作10000次

        public static void main(String[] args) {
            Test test = new Test();
            test.testString();
            test.testStringBuffer();
            test.testStringBuilder();
        }

        private void testString() {
            long startTime = System.nanoTime();// 获得当前系统最准确的计时器,以毫微秒为计时单位
            String temp = "";
            for (int i = 0; i < loopCount; i++) {
                temp += i;
            }
            long endTime = System.nanoTime();
            System.out.println("String运行时间: " + (endTime - startTime));
        }

        private void testStringBuffer() {
            long startTime = System.nanoTime();// 获得当前系统最准确的计时器,以毫微秒为计时单位
            StringBuffer temp = new StringBuffer("");
            for (int i = 0; i < loopCount; i++) {
                temp.append(i);
            }
            long endTime = System.nanoTime();
            System.out.println("StringBuffer运行时间: " + (endTime - startTime));
        }

        private void testStringBuilder() {
            long startTime = System.nanoTime();// 获得当前系统最准确的计时器,以毫微秒为计时单位
            StringBuilder temp = new StringBuilder("");
            for (int i = 0; i < loopCount; i++) {
                temp.append(i);
            }
            long endTime = System.nanoTime();
            System.out.println("StringBuilder运行时间: " + (endTime - startTime));
        }
}

首先,运行这三个String差别,可以看出时间上差异很大

String运行时间: 606270951
StringBuffer运行时间: 1167296
StringBuilder运行时间: 746880

Process finished with exit code 0

String做字符串的拼接中

  String是一个不可变的线程安全的一个函数,关于字符串拼接,其调用

/** The value is used for character storage. */
private final char value[];

由于final是一个不可变的,所以每一次的调用,都需要创建一个新的对象。

String new=“this”+“is”+“a day“;

这样的拼接方式,编译器直接给你拼接为this is a day 实际上就是调用了Stringbuffer直接拼接而成,所以时间和StringBuffer其实差不多。但是如果是String str1="this",String str2="is";String str3="a day";String str=str1+str2+str3;这种形式的话,就是真实的按照String拼接。String的拼接,由于使用final作为不可变参数,所以线程安全。

而StringBuffer,由于需要字符串的拼接,所以有一些独特的用于拼接字符串的方法。

@Override
public synchronized StringBuffer append(Object obj) {
    toStringCache = null;
    super.append(String.valueOf(obj));
    return this;
}

@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

/**
 * @throws StringIndexOutOfBoundsException {@inheritDoc}
 * @since      1.2
 */
@Override
public synchronized StringBuffer delete(int start, int end) {
    toStringCache = null;
    super.delete(start, end);
    return this;
}

这些方法,是用来做字符串拼接有关,我们可以见到synchronized,其中所有的方法都给加了锁,所以这个方法也是线程安全的。

   

private transient char[] toStringCache;

关于字符串拼接,由于不是不可变的,所以速度会快。

另一个的话,和StringBuffer差不多,但是线程不安全。

关于StringBuffer和StringBuilder他们共同继承了

AbstractStringBuilder

和序列化


public AbstractStringBuilder append(char[] str) {
    int len = str.length;
    ensureCapacityInternal(count + len);
    System.arraycopy(str, 0, value, count, len);
    count += len;
    return this;
}

这一部分是字符串拼接部分

© 著作权归作者所有

laohng1995
粉丝 13
博文 37
码字总数 30590
作品 0
杭州
程序员
私信 提问
java中String、StringBuffer、StringBuilder的区别 - jihite

java中String、StringBuffer、StringBuilder的区别 - jihite 博客园jihite2018-01-011 阅读 StringBufferjavaString Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串 ......

博客园_jihite
2018/01/01
0
0
java中StringBuffer、StringBulider、String的区别

String 类   String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。 String a = "a"; //假设a指向地址0x0001 a = "b";//...

帅的不像男的
2016/05/23
87
0
全面解释java中StringBuilder、StringBuffer、String类之间的关系

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字...

姚君
2014/03/13
23
0
String,StringBuilder,StringBuffer对比

简述 StringBuilder 对比 StringBuffer StringBuilder是非线程安全 StringBuffer是线程安全的。 StringBuilder和StringBuffer其余的特性都是一样的,他们与String的区别: StringBuilder与S...

Real_man
2018/03/20
0
0
Java字符串的String、StringBuilder、StringBuffer三者特性详解

一、不可变String类型 字符串是计算机程序设计中的,最常见行为,Java的字符串操作最主要的类是String,并且String对象是不可变的(Immutable),即对象一旦创建在内存中,那么它的内容就不再...

断桥残雪断桥残雪
2015/08/12
160
0

没有更多内容

加载失败,请刷新页面

加载更多

java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
21分钟前
6
0
php-fpm配置文件详解/MariaDB密码重置、慢查询日志

来源:https://blog.csdn.net/Powerful_Fy php-fpm主配置文件路径:/usr/local/php-fpm/etc/php-fpm.conf #位于安装php安装目录下的etc/目录中,该文件中最后一行将配置文件指向:include=/...

asnfuy
25分钟前
7
0
川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
47分钟前
12
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
今天
5
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部