美文网首页
Java基础提升7

Java基础提升7

作者: 努力的土豆 | 来源:发表于2019-03-26 22:02 被阅读0次

今天的内容是关于String,StringBuffer,StringBuilder的一些知识。

基本概念

String前文有详细的讲解,这里简要的说一下,String是被final关键字修饰的类,是一个字符串常量。StringBuffer是一个字符串变量(线程安全),StringBuilder也是一个字符串变量(非线程安全)。

String类型和StringBuffer类型的主要区别,其实是在于String是不可变的对象,因此在每次对String类型进行改变的时候,其实都等于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String。因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开始工作。

如果是使用StringBuffer类结果就不同了,每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以一般情况下推荐使用StringBuffer,特别是字符串对象经常改变的情况下。而在某些特别的情况下,String对象的字符串拼接其实是被JVM解释成了StringBuffer对象的拼接,多以这时候String对象的速度并不会比StringBuffer对象慢,例如,下面的字符串对象生成中,String效率是远比StringBuffer快的。

String s1 = "abc" + "def";
StringBuffer sb = new StringBuffer("abc").append("def");

下面一段是性能的测试

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: StringTest
 * @Description: TODO
 * @Author: kevin
 * @Date: 2019-03-26 20:28
 * @Version: 1.0
 **/
public class StringTest {
    public static String BASEINFO = "Mr.H";
    public static final int count = 2000000;

    public static void doStringTest() {
        String str = new String(BASEINFO);
        long startTimes = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            str = str + "miss";
        }
        long endTimes = System.currentTimeMillis();
        System.out.println("String总耗时:" + (endTimes - startTimes));
    }

    public static void doStringBufferTest() {
        StringBuffer stringBuffer = new StringBuffer(BASEINFO);
        long startTimes = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            stringBuffer = stringBuffer.append("miss");
        }
        long endTimes = System.currentTimeMillis();
        System.out.println("StringBuffer总耗时:" + (endTimes - startTimes));
    }

    public static void doStringBuilderTest() {
        StringBuilder stringBuilder = new StringBuilder(BASEINFO);
        long startTimes = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            stringBuilder = stringBuilder.append("miss");
        }
        long endTimes = System.currentTimeMillis();
        System.out.println("StringBuilder总耗时:" + (endTimes - startTimes));
    }

    public static void doStringBuilderListTest(List<String> mlist) {
        StringBuilder sb = new StringBuilder();
        long startTimes = System.currentTimeMillis();
        for (String str: mlist) {
            sb.append(str);
        }
        long endTimes = System.currentTimeMillis();
        System.out.println(sb.toString() + "StringBuilder总耗时:" + (endTimes - startTimes));
    }

    public static void doStringBufferListTest(List<String> mlist) {
        StringBuffer stringBuffer = new StringBuffer();
        long startTimes = System.currentTimeMillis();
        for (String str: mlist) {
            stringBuffer.append(str);
        }
        long endTimes = System.currentTimeMillis();
        System.out.println(stringBuffer.toString() + "StringBuffer总耗时:" + (endTimes - startTimes));

    }

    public static void main(String[] args) {
        doStringTest();
        doStringBufferTest();
        doStringBuilderTest();

        List<String> list = new ArrayList<>();
        list.add(" I ");
        list.add(" am ");
        list.add(" the ");
        list.add(" best ");

        doStringBufferListTest(list);
        doStringBuilderListTest(list);
    }
}
===============
结果
===============
String总耗时:1413676
StringBuffer总耗时:35
StringBuilder总耗时:24
 I  am  the  best StringBuilder总耗时:0
 I  am  the  best StringBuffer总耗时:0

可以看到在拼接字符串的时候,String性能的消耗是惊人的。

参考链接

Java基础之String、StringBuffer与StringBuilder

String,StringBuffer与StringBuilder的区别?

StringBuffer和StringBuilder的区别

JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?

相关文章

  • Java基础提升7

    今天的内容是关于String,StringBuffer,StringBuilder的一些知识。 基本概念 Stri...

  • java基础:Enum — 源码分析

    其他更多java基础文章:java基础学习(目录) 学习资料Java 7 源码学习系列(二)——EnumJava的...

  • Android知识总结

    一、java基础 Java基础-泛型[https://www.jianshu.com/p/b7d88eec37d9...

  • java接口及其新特性——Java基础回炉(三)

    前言 本文是Java基础回炉文集的第三篇,关于文集可通过《Java基础回炉和提升暨文集开篇》了解。 今天我们将从接...

  • java基础提升篇

    此篇幅是个人整理的一点心得,针对的广大的普通大众人员,还有此篇文章的出发点是从先就业后择业的角度去分析java程序...

  • Java基础提升2

    今天是第二天,感觉有很多东西需要加强,每次看到那些技术大神洋洋洒洒的博客,内心除了崇拜,更多的是鄙视自己,感慨差距...

  • Java基础提升1

    从今天开始进行基本功的提升,(本人很菜,写的可能不好,欢迎大家提出意见,此外,引用别人的东西,我会全部标识出),我...

  • Java基础提升5

    今天的内容是关于Java字符串的。字符串,每一个Java开发人员都会用到,但是真的对它熟悉吗? Java中的Str...

  • Java基础提升3

    昨天太困了,就没有写东西,因此今天会补两篇。 今天的内容将围绕Java的变量,目的是对变量有更深刻的认识。 Jav...

  • Java基础提升4

    本文将阐述关于Java语言中变量是如何存储的。 Java中数据的存储位置 寄存器 最快的存储区,位于处理器的内部,...

网友评论

      本文标题:Java基础提升7

      本文链接:https://www.haomeiwen.com/subject/zcznvqtx.html