Android和Java中String.substring的不同實現,androidsubstring

來源:互聯網
上載者:User

Android和Java中String.substring的不同實現,androidsubstring

今天有幸去搜狗霸筆,有一題很有意思

String str1 = "test for sougou";String str2 = str1.substring(5);

考點是str2是否產生新的字元數組來儲存"for sougou"


當時我認為String內部是封裝了一個char[],無法像cpp一樣首地址加上一個數字來做到char[]的重用

新的字串必須進行一次ArrayCopy才能實現substring功能,所以肯定有新的記憶體產生


回來看了下實現

因為android studio開著,就看了下android下String.substring的實現,並發給了同學

public String substring(int start) {        if (start == 0) {            return this;        }        if (start >= 0 && start <= count) {            return new String(offset + start, count - start, value);        }        throw indexAndLength(start);    }
String(int offset, int charCount, char[] chars) {        this.value = chars;        this.offset = offset;        this.count = charCount;    }

利用成員變數offset儲存下位移量,直接把char[]引用給了新的String,沒有申請記憶體

感歎好精妙的實現的同時,發現自己做錯了



誰知道同學看了原始碼後問我用的什麼版本的jdk,和他那邊的實現不一樣

public String substring(int beginIndex) {        if (beginIndex < 0) {            throw new StringIndexOutOfBoundsException(beginIndex);        }        int subLen = value.length - beginIndex;        if (subLen < 0) {            throw new StringIndexOutOfBoundsException(subLen);        }        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);    }

public String(char value[], int offset, int count) {        if (offset < 0) {            throw new StringIndexOutOfBoundsException(offset);        }        if (count < 0) {            throw new StringIndexOutOfBoundsException(count);        }        // Note: offset or count might be near -1>>>1.        if (offset > value.length - count) {            throw new StringIndexOutOfBoundsException(offset + count);        }        this.value = Arrays.copyOfRange(value, offset, offset+count);    }
除了beginIndex=0是直接返回當前外,其他都進行ArrayCopy


是的!!!在JDK中new了新記憶體了!!!
不得不說,google程式員確實更高一籌




java代碼(android中的java): public String substring(int start) { if (start == 0) { return this; }

String (int offset, int count, char[] value)是String的一個非公有構造方法!你在API文檔中是無法查到的,只能看底層源碼的實現才能發現。其實這個構造方法內部是通過調整value的位移值(offset)和有效長度值(count)來實現String.substring方法的!說的再準確點就是substring方法產生的String對象與原String對象共用一個value,而不是char[]的子串拷貝!
 
Android開發時用xlm寫的view與用java寫的view有什不同,哪個好

XMl更簡單,但實際上Android編譯時間還需要對你的布局XML代碼進行解析,然後才將一個個View畫出來。而java代碼寫布局雖然略顯複雜,但也更加直接,要做一個封裝性比較好的控制項,還是用代碼布局吧。代碼布局也不難,例如定義一個LinearLayout對象,然後通過它的addView方法添加子View,這其中有一個參數LayoutParam,用來設定子空間的width、height、margin、gravity、padding、weight等等。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.