zoukankan      html  css  js  c++  java
  • 谈String,StringBuilder,StringBuffer随笔

    一.谈谈三者在实现上的区别。

      (1)先看String 方法,实现了Serializable, Comparable, CharSequence三个接口

    package java.lang;
    
    import java.io.*;
    import java.nio.charset.Charset;
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public final class String
        implements Serializable, Comparable, CharSequence
    {
        private static class CaseInsensitiveComparator
            implements Comparator, Serializable
        {
    
            public int compare(String s, String s1)
            {

     其次看一下StringBuffer和StringBuilder

    package java.lang;
    import java.io.*;
    public final class StringBuffer extends AbstractStringBuilder
        implements Serializable, CharSequence
    {
    package java.lang;
    import java.io.*;
    public final class StringBuilder extends AbstractStringBuilder
        implements Serializable, CharSequence
    {

    可以很明显的看出String 和StringBuffer,StringBuilder有相对较大的区别,实时也是如此。StringBuffer,StringBuilder几乎一样,StringBuffer就是里面做了一些synchronized 修饰,从保证线程安全的。StringBuffer,StringBuilder继承了AbstractStringBuilder,实际上AbstractStringBuilder实现了Appendable, CharSequence这两个接口,从而也可在继承和实现的看出区别,三个共同实现了Serializable,CharSequence。而String 实现的有Comparable,则String 和StringBuffer实现Appendable

    二.谈谈三者效率区别。

    先用三组数据来看看

     1 package com;
     2 public class test {
     3     public static void main(String[] args) {
     4         
     5         //String
     6         long i =  System.currentTimeMillis();
     7         String st = "";
     8         for(int j = 0;j<100000;j++){
     9             st="aaa"+"bbb"+"ccc";
    10         }
    11         long i1 = System.currentTimeMillis();
    12         System.out.println(i1-i);
    13         
    14         //String
    15         long s1 =  System.currentTimeMillis();
    16         String st1 = "aaa";
    17         String st2 = "bbb";
    18         String st3 = "ccc";
    19         String st4 = "";
    20         
    21         for(int j = 0;j<100000;j++){
    22             st4=st1+st2+st3;
    23         }
    24         long s2 = System.currentTimeMillis();
    25         System.out.println(s2-s1);
    26         
    27         //StringBuffer
    28         long i2 = System.currentTimeMillis();
    29         String st5 = "ddd";
    30         StringBuffer sb = new StringBuffer();
    31         for(int j = 0;j<100000;j++){
    32             sb=sb.append(st5);
    33         }
    34         long i3 =  System.currentTimeMillis();
    35         System.out.println(i3-i2);    
    36     }
    37 
    38 }

    以上的执行结果   1  16   4   单位是ms

    以上做了String,StringBuilder的比较的,因为StringBuilder,StringBuffer几乎差不多。

    首先看两次的Stirng执行效率,1  16 效率差距还是蛮大的,虽然实现效果一样,但是真正的实现时候,前一个并没有做创建,然后再做“+”这个操作,而是再文件编译阶段,就已经将完成"aaa"+"bbb"+"ccc"操作,将"aaabbbccc"当做一个字符串常量放到常量区,而100000对赋值仅仅是去字符串对象地址取出便可,这个取得效率是很高的。但是后者却是实实在在的创建了100000此对象,然后又做了相同次数+运算,赋值这个步骤和前者时间差不多的,真的耗时就在创建和+这两个步骤了,有大量对象就会需要GC来处理。因此为了提高效率,尽量避免创建对象。

    其次咱们来看看Sting 和 StringBuilder这两个的执行效率,16  4 同样是拼接了100000次,时间相差不可谓不小,从结果上来看可以很明显得出 大量字符串拼接时候,StringBuffer的append()效率要远远好于String对象+连接。原因也很简单,String 做拼接的时候他的value[]不能改变,每次操作都需要创建新的对象,而StringBuffer得value[]是可以变得,只是扩大即可,所以效率会好很多。

    StringBuilder,StringBuffer的效率差不多,而StringBuffer支持多线程,所以相对来说StringBuilderStringBuffer稍好点。

    有什么疑问欢迎留言探讨。

  • 相关阅读:
    Leetcode463. Island Perimeter
    C++ 编写的解码器小程序 map
    LeetCode706. Design HashMap
    LeetCode705. Design HashSet
    LeetCode804. Unique Morse Code Words
    c++后台开发 准备材料
    Scott Young-《如何高效学习》
    跳表和散列
    时间复杂度 log n
    第35题:LeetCode138. Copy List with Random Pointer
  • 原文地址:https://www.cnblogs.com/atongmyuxiaowanzi/p/10668531.html
Copyright © 2011-2022 走看看