zoukankan      html  css  js  c++  java
  • String、StringBuffer、StringBuilder区别并验证

    © 版权声明:本文为博主原创文章,转载请注明出处

    String、StringBuffer、StringBuilder的区别

    1.String是一个常量,其对象一旦创建完毕就无法改变,当使用“+”拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。

     StringBuffer和StringBuilder都是变量,追加内容时不会生成新的对象。

    2.String初始化的时候是最快的,StringBuilder其次,StringBuffer最慢

     但是修改内容的时候StringBuilder是最快的,StringBuffer其次,String最慢

    3.String是常量,因此线程安全。

     StringBuffer是线程安全的,StringBuilder是非线程安全的

    验证

    1.String是常量,改变值会生成新的对象;StringBuffer和StringBuilder是变量,改变值不会生成新的对象

     1 /**
     2      * 内存比较
     3      */
     4     private static void memery() {
     5 
     6         String str1 = "abc";
     7         System.out.println("String first memery address is " + str1.hashCode());
     8         str1 += "efg";
     9         System.out.println("String second memery address is " + str1.hashCode());
    10 
    11         StringBuilder sb1 = new StringBuilder("abc");
    12         System.out.println("StringBuilder first memery address is " + sb1.hashCode());
    13         sb1.append("efg");
    14         System.out.println("StringBuilder second memery address is " + sb1.hashCode());
    15 
    16         StringBuffer sb2 = new StringBuffer("abc");
    17         System.out.println("StringBuffer first memery address is " + sb2.hashCode());
    18         sb2.append("efg");
    19         System.out.println("StringBuffer second memery address is " + sb2.hashCode());
    20 
    21     }
    memery

    结果:

    2.初始化速度:String>StringBuilder>StringBuffer

     1 /**
     2      * 初始化性能比较
     3      */
     4     private static void initial() {
     5 
     6         long time1 = System.nanoTime();
     7         String str1 = "abc";
     8         long time2 = System.nanoTime();
     9         System.out.println("String time: " + (time2 - time1) + "ns");
    10 
    11         long time3 = System.nanoTime();
    12         StringBuffer sb1 = new StringBuffer("abc");
    13         long time4 = System.nanoTime();
    14         System.out.println("StringBuffer time: " + (time4 - time3) + "ns");
    15 
    16         long time5 = System.nanoTime();
    17         StringBuilder sb2 = new StringBuilder("abc");
    18         long time6 = System.nanoTime();
    19         System.out.println("StringBuilder time: " + (time6 - time5) + "ns");
    20 
    21     }
    initial

    结果:

    3.执行速度(即改变值的时候):StringBuilder>StringBuffer>String

     1 /**
     2      * 性能比较
     3      */
     4     private static void performance() {
     5 
     6         long time1 = System.nanoTime();
     7         String str1 = "";
     8         for (int i = 0; i < 10; i++) {
     9             str1 += i;
    10         }
    11         long time2 = System.nanoTime();
    12         System.out.println("the time required for String to execute 1000 times: " + (time2 - time1) + "ns");
    13 
    14         long time3 = System.nanoTime();
    15         StringBuffer sb1 = new StringBuffer();
    16         for (int i = 0; i < 10; i++) {
    17             sb1.append(i);
    18         }
    19         long time4 = System.nanoTime();
    20         System.out.println("the time required for StringBuffer to execute 1000 times: " + (time4 - time3) + "ns");
    21 
    22         long time5 = System.nanoTime();
    23         StringBuilder sb2 = new StringBuilder();
    24         for (int i = 0; i < 10; i++) {
    25             sb2.append(i);
    26         }
    27         long time6 = System.nanoTime();
    28         System.out.println("the time required for StringBuilder to execute 1000 times: " + (time6 - time5) + "ns");
    29 
    30     }
    performance

    结果:

     

    4.特殊例子:当执行String str = "a" + "b" + "c"时,String的速度是最快的,因为等价于String = "abc";上面讲过,初始化的时候String是最快的

     1 /**
     2      * 特殊例子
     3      */
     4     private static void special() {
     5 
     6         long time1 = System.nanoTime();
     7         String str1 = "abc" + "def" + "ghi" + "jk";
     8         long time2 = System.nanoTime();
     9         System.out.println("String time: " + (time2 - time1) + "ns");
    10 
    11         long time3 = System.nanoTime();
    12         StringBuffer sb1 = new StringBuffer("abc").append("def").append("ghi").append("jk");
    13         long time4 = System.nanoTime();
    14         System.out.println("StringBuffer time: " + (time4 - time3) + "ns");
    15 
    16         long time5 = System.nanoTime();
    17         StringBuilder sb2 = new StringBuilder("abc").append("def").append("ghi").append("jk");
    18         long time6 = System.nanoTime();
    19         System.out.println("StringBuilder time: " + (time6 - time5) + "ns");
    20 
    21     }
    special

    结果:

    5.StringBuffer是线程安全的,StringBuilder是非线程安全的

     1 /**
     2      * 线程安全性验证
     3      */
     4     public static void thread() {
     5 
     6         final StringBuffer sb1 = new StringBuffer();
     7         final StringBuilder sb2 = new StringBuilder();
     8         final CountDownLatch latch1 = new CountDownLatch(1000);
     9         final CountDownLatch latch2 = new CountDownLatch(1000);
    10 
    11         for (int i = 0; i < 1000; i++) {
    12             new Thread(new Runnable() {
    13                 public void run() {
    14                     try {
    15                         sb1.append("1");
    16                     } finally {
    17                         latch1.countDown();
    18                     }
    19 
    20                 }
    21             }).start();
    22         }
    23         for (int i = 0; i < 1000; i++) {
    24             new Thread(new Runnable() {
    25                 public void run() {
    26                     try {
    27                         sb2.append("2");
    28                     } finally {
    29                         latch2.countDown();
    30                     }
    31                 }
    32             }).start();
    33         }
    34 
    35         try {
    36             latch1.await();
    37             System.out.println(sb1.length());
    38             latch2.await();
    39             System.out.println(sb2.length());
    40         } catch (Exception e) {
    41             e.printStackTrace();
    42         }
    43 
    44     }
    thread

    结果:需多执行几次,StringBuffer长度全部为1000,StringBuilder大部分都是小于1000的

    6.完整代码

      1 package org.java.base;
      2 
      3 import java.util.concurrent.CountDownLatch;
      4 
      5 /**
      6  * String、StringBuffer、StringBuilder比较
      7  */
      8 public class StringAndStringBufferAndStringBuilder {
      9 
     10     public static void main(String[] args) {
     11 
     12         //memery();
     13         //initial();
     14         //performance();
     15         //special();
     16         thread();
     17 
     18     }
     19 
     20     /**
     21      * 内存比较
     22      */
     23     private static void memery() {
     24 
     25         String str1 = "abc";
     26         System.out.println("String first memery address is " + str1.hashCode());
     27         str1 += "efg";
     28         System.out.println("String second memery address is " + str1.hashCode());
     29 
     30         StringBuilder sb1 = new StringBuilder("abc");
     31         System.out.println("StringBuilder first memery address is " + sb1.hashCode());
     32         sb1.append("efg");
     33         System.out.println("StringBuilder second memery address is " + sb1.hashCode());
     34 
     35         StringBuffer sb2 = new StringBuffer("abc");
     36         System.out.println("StringBuffer first memery address is " + sb2.hashCode());
     37         sb2.append("efg");
     38         System.out.println("StringBuffer second memery address is " + sb2.hashCode());
     39 
     40     }
     41 
     42     /**
     43      * 初始化性能比较
     44      */
     45     private static void initial() {
     46 
     47         long time1 = System.nanoTime();
     48         String str1 = "abc";
     49         long time2 = System.nanoTime();
     50         System.out.println("String time: " + (time2 - time1) + "ns");
     51 
     52         long time3 = System.nanoTime();
     53         StringBuffer sb1 = new StringBuffer("abc");
     54         long time4 = System.nanoTime();
     55         System.out.println("StringBuffer time: " + (time4 - time3) + "ns");
     56 
     57         long time5 = System.nanoTime();
     58         StringBuilder sb2 = new StringBuilder("abc");
     59         long time6 = System.nanoTime();
     60         System.out.println("StringBuilder time: " + (time6 - time5) + "ns");
     61 
     62     }
     63 
     64     /**
     65      * 性能比较
     66      */
     67     private static void performance() {
     68 
     69         long time1 = System.nanoTime();
     70         String str1 = "";
     71         for (int i = 0; i < 10; i++) {
     72             str1 += i;
     73         }
     74         long time2 = System.nanoTime();
     75         System.out.println("the time required for String to execute 1000 times: " + (time2 - time1) + "ns");
     76 
     77         long time3 = System.nanoTime();
     78         StringBuffer sb1 = new StringBuffer();
     79         for (int i = 0; i < 10; i++) {
     80             sb1.append(i);
     81         }
     82         long time4 = System.nanoTime();
     83         System.out.println("the time required for StringBuffer to execute 1000 times: " + (time4 - time3) + "ns");
     84 
     85         long time5 = System.nanoTime();
     86         StringBuilder sb2 = new StringBuilder();
     87         for (int i = 0; i < 10; i++) {
     88             sb2.append(i);
     89         }
     90         long time6 = System.nanoTime();
     91         System.out.println("the time required for StringBuilder to execute 1000 times: " + (time6 - time5) + "ns");
     92 
     93     }
     94 
     95     /**
     96      * 特殊例子
     97      */
     98     private static void special() {
     99 
    100         long time1 = System.nanoTime();
    101         String str1 = "abc" + "def" + "ghi" + "jk";
    102         long time2 = System.nanoTime();
    103         System.out.println("String time: " + (time2 - time1) + "ns");
    104 
    105         long time3 = System.nanoTime();
    106         StringBuffer sb1 = new StringBuffer("abc").append("def").append("ghi").append("jk");
    107         long time4 = System.nanoTime();
    108         System.out.println("StringBuffer time: " + (time4 - time3) + "ns");
    109 
    110         long time5 = System.nanoTime();
    111         StringBuilder sb2 = new StringBuilder("abc").append("def").append("ghi").append("jk");
    112         long time6 = System.nanoTime();
    113         System.out.println("StringBuilder time: " + (time6 - time5) + "ns");
    114 
    115     }
    116 
    117     /**
    118      * 线程安全性验证
    119      */
    120     public static void thread() {
    121 
    122         final StringBuffer sb1 = new StringBuffer();
    123         final StringBuilder sb2 = new StringBuilder();
    124         final CountDownLatch latch1 = new CountDownLatch(1000);
    125         final CountDownLatch latch2 = new CountDownLatch(1000);
    126 
    127         for (int i = 0; i < 1000; i++) {
    128             new Thread(new Runnable() {
    129                 public void run() {
    130                     try {
    131                         sb1.append("1");
    132                     } finally {
    133                         latch1.countDown();
    134                     }
    135 
    136                 }
    137             }).start();
    138         }
    139         for (int i = 0; i < 1000; i++) {
    140             new Thread(new Runnable() {
    141                 public void run() {
    142                     try {
    143                         sb2.append("2");
    144                     } finally {
    145                         latch2.countDown();
    146                     }
    147                 }
    148             }).start();
    149         }
    150 
    151         try {
    152             latch1.await();
    153             System.out.println(sb1.length());
    154             latch2.await();
    155             System.out.println(sb2.length());
    156         } catch (Exception e) {
    157             e.printStackTrace();
    158         }
    159 
    160     }
    161 
    162 }
    StringAndStringBufferAndStringBuilder
  • 相关阅读:
    python模块之subprocess
    Linux系统中如何升级pip
    如何发布自己用python写的py模块
    Win10系统如何分区
    Win10修改编辑文件无法保存怎么办(没有权限)
    robotframework利用selenium2Library实现无界面自动化关键字
    jmeter学习之安装篇(一)
    javascript——this关键字
    Ajax——请求
    AJAX学习——什么是AJAX
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/7725022.html
Copyright © 2011-2022 走看看