<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sung in Blog

               一些技術文章 & 一些生活雜碎
    問題:在String對象中有個構造函數是直接接受StringBuffer的。程序如下:

    public String (StringBuffer buffer) {
    synchronized(buffer) {
    buffer.setShared();
    this.value = buffer.getValue();
    this.offset = 0;
    this.count = buffer.length();
    }
    }


    在StringBuffer中:

    final char[] getValue() { return value; }


    很明顯的,這個構造函數直接把StringBuffer的char[]數組返回給了String對象。也就是現在新生成的String和StringBuffer共用同一個char[]數組,但是下面的程序為什么會打印出以下結果呢:

    StringBuffer sb = new StringBuffer("abc");
    System.out.println("StringBuffer: " + sb.toString());
    String s = new String(sb);
    System.out.println("String: " + s);
    sb.append("123");
    System.out.println("StringBuffer: " + sb);
    System.out.println("String: " + s);
    /////////////////////////////////////////////////////////////////////
    StringBuffer: abc
    String: abc
    StringBuffer: abc123
    String: abc


    分析:這個問題的核心答案在 this.count = buffer.length() 這句話上。這句話的意思是String中的count的大小為這個char[]數組中實際含有的字符的個數,而不是這個數組的大小。所以在打印的時候對于上面的String對象,只會打印3個字符,而不是6個字符!

    新的問題:如果我從StringBuffer中刪除了一個字符,那么String對象也應該受到影響了?但是為什么實際上這個String沒有發生變化呢?問題的答案在buffer.setShared()上,這句話的含義就是告訴這個StringBuffer,有其它的String對象與它共享它的char[]數組。

    這個時候,當它進行delete,insert等操作的時候,它會新生成一個char[]數組,然后再進行操作。所以這個時候String和StringBuffer就不共享同一個數組了,String自然也就不會受到影響了。

    為什么要用這么復雜的方法呢?答案是“節省內存資源”。可以想想,我們在程序中使用最頻繁的對象都有哪些,答案肯定包含String。而我們知道,在拼裝一個String的時候,使用StringBuffer效率最高。所以我們會先用StringBuffer動態的拼裝好一個字符串,然后再把它轉化成String對象,這個時候就會突顯這種方式的經典之處了。下面是StringBuffer的toString()方法:

    public String toString() {
    return new String(this);
    }


    public String (StringBuffer buffer) {
    synchronized(buffer) {
    buffer.setShared();
    this.value = buffer.getValue();
    this.offset = 0;
    this.count = buffer.length();
    }
    }


    在StringBuffer中:

    final char[] getValue() { return value; }


    很明顯的,這個構造函數直接把StringBuffer的char[]數組返回給了String對象。也就是現在新生成的String和StringBuffer共用同一個char[]數組,但是下面的程序為什么會打印出以下結果呢:

    StringBuffer sb = new StringBuffer("abc");
    System.out.println("StringBuffer: " + sb.toString());
    String s = new String(sb);
    System.out.println("String: " + s);
    sb.append("123");
    System.out.println("StringBuffer: " + sb);
    System.out.println("String: " + s);
    /////////////////////////////////////////////////////////////////////
    StringBuffer: abc
    String: abc
    StringBuffer: abc123
    String: abc


    分析:這個問題的核心答案在 this.count = buffer.length() 這句話上。這句話的意思是String中的count的大小為這個char[]數組中實際含有的字符的個數,而不是這個數組的大小。所以在打印的時候對于上面的String對象,只會打印3個字符,而不是6個字符!

    新的問題:如果我從StringBuffer中刪除了一個字符,那么String對象也應該受到影響了?但是為什么實際上這個String沒有發生變化呢?問題的答案在buffer.setShared()上,這句話的含義就是告訴這個StringBuffer,有其它的String對象與它共享它的char[]數組。

    這個時候,當它進行delete,insert等操作的時候,它會新生成一個char[]數組,然后再進行操作。所以這個時候String和StringBuffer就不共享同一個數組了,String自然也就不會受到影響了。

    為什么要用這么復雜的方法呢?答案是“節省內存資源”。可以想想,我們在程序中使用最頻繁的對象都有哪些,答案肯定包含String。而我們知道,在拼裝一個String的時候,使用StringBuffer效率最高。所以我們會先用StringBuffer動態的拼裝好一個字符串,然后再把它轉化成String對象,這個時候就會突顯這種方式的經典之處了。下面是StringBuffer的toString()方法:

    public String toString() {
    return new String(this);
    }

    ]]>
    posted on 2005-09-20 14:28 Sung 閱讀(161) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 青娱乐免费在线视频| 97在线线免费观看视频在线观看| 日本19禁啪啪无遮挡免费动图| 亚洲综合丁香婷婷六月香| 丁香花免费完整高清观看| 最新国产成人亚洲精品影院| 国产在线a免费观看| 亚洲av永久无码嘿嘿嘿| 成人毛片免费观看| 国产综合激情在线亚洲第一页| 国产一级大片免费看| 四虎国产精品永免费| 国产亚洲AV夜间福利香蕉149| 91国内免费在线视频| 亚洲AV成人片色在线观看高潮| 222www在线观看免费| 亚洲人成激情在线播放| 成人免费视频试看120秒| 视频一区在线免费观看| 国产精品亚洲一区二区三区在线 | 免费观看无遮挡www的小视频| 亚洲a级在线观看| 四虎影院永久免费观看| 好男人资源在线WWW免费| 久久精品国产亚洲AV嫖农村妇女| 99久久久精品免费观看国产| 鲁死你资源站亚洲av| 久久亚洲国产成人影院网站| 久久爰www免费人成| 亚洲成a人无码亚洲成av无码| 亚洲中文字幕成人在线| 57pao国产成视频免费播放| 亚洲欧洲无码一区二区三区| 亚洲福利在线播放| 84pao强力永久免费高清| 亚洲第一成年免费网站| 久久精品国产亚洲香蕉| 免费看片免费播放| 久久久久久久99精品免费观看| 亚洲精品二三区伊人久久| 亚洲国产成人久久精品99|