• Java之String,StringBuffer,StringBuilder类


    在 java 语言中, 用来处理字符串的的类常用的有 3 个: String、StringBuffer、StringBuilder。

    它们的异同点:

    1) 都是 final 类, 都不允许被继承;

    2) String 长度是不可变的, StringBuffer、StringBuilder 长度是可变的;

    3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的。就是说StringBuffer类中的很多方法使用了synchronized关键字修饰,允许多线程进行操作字符串。

    三个类大部分时间性能:StringBuilder》StringBuffer》String。

    4) StringBuffer 和StringBuilder 方法的使用基本上一样

    使用以下代码测试性能:

     1 public class TestStringClass {
     2 
     3     private final int LOOPS = 200000;
     4     private final String CONSTANT_STRING = "java-String";
     5 
     6     public static void main(String[] args) {
     7 
     8         new TestStringClass().testString();
     9         new TestStringClass().testStringBuffer();
    10         new TestStringClass().testStringBullder();
    11     }
    12 
    13     public void testString() {
    14         String string = "";
    15         long currentTime = System.currentTimeMillis();
    16         for (int i = 0; i < LOOPS; i++) {
    17             string += CONSTANT_STRING;
    18         }
    19         long endTime = System.currentTimeMillis();
    20         System.out.println("String: " + (endTime - currentTime));
    21     }
    22 
    23     public void testStringBuffer() {
    24         StringBuffer stringBuffer = new StringBuffer();
    25         long currentTime = System.currentTimeMillis();
    26         for (int i = 0; i < LOOPS; i++) {
    27             stringBuffer.append(CONSTANT_STRING);
    28         }
    29         long endTime = System.currentTimeMillis();
    30         System.out.println("StringBuffer: " + (endTime - currentTime));
    31     }
    32 
    33     public void testStringBullder() {
    34         StringBuilder stringBuilder = new StringBuilder();
    35         long currentTime = System.currentTimeMillis();
    36         for (int i = 0; i < LOOPS; i++) {
    37             stringBuilder.append(CONSTANT_STRING);
    38         }
    39         long endTime = System.currentTimeMillis();
    40         System.out.println("StringBullder: " + (endTime - currentTime));
    41     }
    42 }

    结果:

    String: 149549
    StringBuffer: 9
    StringBullder: 7

    差别很明显。String的性能差的厉害。

    但是呢,假如在编译阶段使用字符串常量的话,String的性能会很快的。

    总结:

    1.在编译阶段使用字符串常量的话,使用String。比如:String haha = "I" + " am " + "java";

    2.在不考虑线程安全的情况下,StringBuilder对象的append效率高于StringBuffer对象的append效率要高于String对象的"+"连接操作。

    3.多线程同步的情况下,建议使用StringBuffer。

  • 相关阅读:
    selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
    ERROR: virtualenvwrapper could not find virtualenv in your path
    VM中的Centos 7配置静态IP
    CentOS7 安装JumpServer
    ERROR 1130 (HY000): Host 'test177' is not allowed to connect to this MySQL server
    获取到一张表中指定字段重复的数量
    Windows7设置局域网文件共享
    vmware虚拟机安装Windows 7后虚拟机自动挂起
    关于PHP版本比较函数version_compare的问题
    关于数据表中一对多、多对一关系的设计
  • 原文地址:https://www.cnblogs.com/liyiran/p/4747017.html
Copyright © 2020-2023  润新知