Android和Java中String.substring的不同實現
今天有幸去搜狗霸筆,有一題很有意思
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); }
除了beginIndex=0是直接返回當前外,其他都進行ArrayCopypublic 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); }
是的!!!在JDK中new了新記憶體了!!!
不得不說,google程式設計師確實更高一籌
更正下,不是google的修改,是openjdk和jdk的區別
相關推薦
Android和Java中String.substring的不同實現
今天有幸去搜狗霸筆,有一題很有意思 String str1 = "test for sougou"; String str2 = str1.substring(5); 考點是str2是否生成新的字元陣列來儲存"for sougou" 當時我認為String內部是封裝了
Android和JAVA中接入web3j
1:先啟動geth節點 geth --identity "xiaohong" --rpc --rpccorsdomain "*" --rpcaddr "192.168.1.105" --datadir "./" --port "30303" --nodiscover --
C#和java中String的異同
Java和C#是極其的相似,兩種語言都各有優劣,這裡對Java和C#中string的異同進行一下介紹。 相同點: 1/ 在java和C#中string都被看做物件來處理,都有處理字串的豐富的方法。 2/ 在java和C#中string都是不可變類。 亦即,當兩個string變數s1,s2指向同一個字串物件s
android 利用java中的多執行緒和io流,最快速度的下載伺服器檔案,android 實現apk下載展現通知欄
首先,我們得來說下多執行緒下載實現的大致思路,以及在使用多執行緒下載過程應該需要注意的問題。 多執行緒下載實現的大致思路: 大致思路是這樣的,也就是把整個一個檔案資源分為若干個部分,然後開啟若干個執行緒,並且使得每個執行緒負責下載每個子部分的檔案,由於
java中String new和直接賦值的區別
字符串相同 main 基礎 還需 賦值 請問 常量 int 表達 Java中String new和直接賦值的區別 對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的
java中String的equals()和 ==
spa 相等 println div 說明 java pri equal new 1 String a=new String("java"); 2 String b=new String("java"); 3 Syst
JAVA中string.replace()和string.replaceAll()的區別及用法
mod btn dsm ont match cep 產生 生成 語法 乍一看,字面上理解好像replace只替換第一個出現的字符(受javascript的影響),replaceall替換所有的字符,其實大不然,只是替換的用途不一樣。 public Strin
java中string和int的相互轉換
integer chan 也會 tee tex 什麽 產生 chang details java中string和int的相互轉換 int -> String int i=12345;String s="";核心:s=i+""; String -> int s="
Java中String直接賦字符串和new String的區別 如String str=new String("a")和String str = "a"有什麽區別?
this his The tin ase name ++ 常量池 TE 百度的面試官問 String A="ABC"; String B=new String("ABC"); 這兩個值,A,B 是否相等,如果都往HashSet裏面放,能放下嗎? 答:A==B 不等,
java中String、StringBuffer和StringBuilder的區別(簡單介紹)
情況 string 建議 code serializa 就是 同步 安全性 之間 簡單介紹 java中用於處理字符串常用的有三個類: 1、java.lang.String 2、java.lang.StringBuffer 3、java.lang.StrungBuilder
java和c#中String
語句 end sql string light pre col 逗號 builder java中: c#中: 1.拼接字符串 sql語句中 in() str="‘001‘,‘002‘,‘003‘";至於產生string就這樣 str1="‘001‘";str2
Java中String方法的練習和使用
package com.sdc.test; public class StringTest01 { public static void main(String[] args) { /*//使用String()方法初始化的建立一個物件 String str = new String(
java中String和date之間的互轉
1 Java時間格式轉換大全 2 3 import java.text.*; 4 import java.util.Calendar; 5 public class VeDate { 6 /** 7 * 獲取現在時間 8 * 9 * @ret
JAVA中String、StringBuffer和StringBuilder的形式引數問題
由於StringBuffer和StringBuilder只有安全性不同,因此本文中用StringBuilder代表StringBuffer和StringBuilder。 形式引數分為兩種:1、基本資料型別 2、引用資料型別 1、方法呼叫時,實際引數將它的值傳遞給對應的形式引
Java中String 、StringBuffer和StringBuilder的區別
String 類是不可改變的,所以你一旦建立了 String 物件,那它的值就無法改變了 StringBuffer 和 StringBuilder 類相同點: StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。 Str
java中String字串拼接“+”和StringBuffer的效率對比
1、前言 (1)最近在做資料傳輸時,由於接收的資料量較大,在字串拼接時使用了以前感覺方便的“+”進行字串拼接,最後拼接到最後時間越來越多,導致效率變慢。 2、String拼接 首先來看一下兩個String用“+”號拼接需要的時間 String aa="E0 00 00 00 00
圖解Java中String、StringBuffer和StringBuilder的區別
圖解Java中String、StringBuffer和StringBuilder的區別 參考部落格:https://blog.csdn.net/weixin_41101173/article/details/79677982 一、Java中的 String 類——String 是字串常量 1、字
Java中String和byte[]間的轉換淺析
Java語言中字串型別和位元組陣列型別相互之間的轉換經常發生,網上的分析及程式碼也比較多,本文將分析總結常規的byte[]和String間的轉換以及十六進位制String和byte[]間相互轉換的原理及實現。 1. String轉byte[] 首先我們來分析一下常規的Strin
Bip44確定性演算法的Java實現庫(Android和java平臺都可以使用)
簡介 這是一個Bip44確定性演算法的Java實現庫(Android和java平臺,都可以使用),可以生成12個助記詞,seed種子和根據path路徑生成路徑的私鑰. 對Bip44確定演算法不瞭解的可以看我之前的一篇文章:區塊鏈開發之確定性演算法bip32,bip39,b
論 java中String 和 new String還有物件中的String字串在記憶體中的儲存
一直以來,所有人都說,java中的String型別是不可變的,可是為什麼不可變確很少有人說的透徹,String和new String的區別,物件中的String和直接定義一個String是否有區別,一直都是一知半解。看了很多文件都是各種猜測,沒有具體程式碼來