zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    在某个点上弹出层
    根据表名、过程名、视图名查找对应的数据库
    js时间转换nan问题 兼容浏览器
    过滤html标记 以及 返回顶部
    自定义控件 加入include 报错 问题
    在有索引视图的表上新增、修改、删除 报错 set ARITHABORT 选项不对
    访微博代码
    兼容问题 链接不跳转
    js上下滚动代码
    onload问题
  • 原文地址:https://www.cnblogs.com/liyiran/p/4747017.html
Copyright © 2011-2022 走看看