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等等。