1. 程式人生 > >Android和Java中String.substring的不同實現

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);
    }

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程式設計師確實更高一籌

更正下,不是google的修改,是openjdk和jdk的區別

相關推薦

AndroidJavaString.substring不同實現

今天有幸去搜狗霸筆,有一題很有意思 String str1 = "test for sougou"; String str2 = str1.substring(5); 考點是str2是否生成新的字元陣列來儲存"for sougou" 當時我認為String內部是封裝了

AndroidJAVA接入web3j

1:先啟動geth節點 geth --identity "xiaohong" --rpc --rpccorsdomain "*" --rpcaddr "192.168.1.105"  --datadir "./" --port "30303" --nodiscover --

C#javaString的異同

Java和C#是極其的相似,兩種語言都各有優劣,這裡對Java和C#中string的異同進行一下介紹。 相同點: 1/ 在java和C#中string都被看做物件來處理,都有處理字串的豐富的方法。 2/ 在java和C#中string都是不可變類。 亦即,當兩個string變數s1,s2指向同一個字串物件s

android 利用java的多執行緒io流,最快速度的下載伺服器檔案,android 實現apk下載展現通知欄

首先,我們得來說下多執行緒下載實現的大致思路,以及在使用多執行緒下載過程應該需要注意的問題。      多執行緒下載實現的大致思路:      大致思路是這樣的,也就是把整個一個檔案資源分為若干個部分,然後開啟若干個執行緒,並且使得每個執行緒負責下載每個子部分的檔案,由於

javaString new直接賦值的區別

字符串相同 main 基礎 還需 賦值 請問 常量 int 表達 Java中String new和直接賦值的區別 對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的

javaString的equals() ==

spa 相等 println div 說明 java pri equal new 1 String a=new String("java"); 2 String b=new String("java"); 3 Syst

JAVAstring.replace()string.replaceAll()的區別及用法

mod btn dsm ont match cep 產生 生成 語法 乍一看,字面上理解好像replace只替換第一個出現的字符(受javascript的影響),replaceall替換所有的字符,其實大不然,只是替換的用途不一樣。 public Strin

javastringint的相互轉換

integer chan 也會 tee tex 什麽 產生 chang details java中string和int的相互轉換 int -> String int i=12345;String s="";核心:s=i+""; String -> int s="

JavaString直接賦字符串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 不等,

javaString、StringBufferStringBuilder的區別(簡單介紹)

情況 string 建議 code serializa 就是 同步 安全性 之間 簡單介紹 java中用於處理字符串常用的有三個類: 1、java.lang.String 2、java.lang.StringBuffer 3、java.lang.StrungBuilder

javac#String

語句 end sql string light pre col 逗號 builder java中: c#中: 1.拼接字符串 sql語句中 in() str="‘001‘,‘002‘,‘003‘";至於產生string就這樣 str1="‘001‘";str2

JavaString方法的練習使用

package com.sdc.test; public class StringTest01 { public static void main(String[] args) { /*//使用String()方法初始化的建立一個物件 String str = new String(

javaStringdate之間的互轉

1 Java時間格式轉換大全 2 3 import java.text.*; 4 import java.util.Calendar; 5 public class VeDate { 6 /** 7 * 獲取現在時間 8 * 9 * @ret

JAVAString、StringBufferStringBuilder的形式引數問題

由於StringBuffer和StringBuilder只有安全性不同,因此本文中用StringBuilder代表StringBuffer和StringBuilder。 形式引數分為兩種:1、基本資料型別   2、引用資料型別 1、方法呼叫時,實際引數將它的值傳遞給對應的形式引

JavaString 、StringBufferStringBuilder的區別

String 類是不可改變的,所以你一旦建立了 String 物件,那它的值就無法改變了 StringBuffer 和 StringBuilder 類相同點: StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。 Str

javaString字串拼接“+”StringBuffer的效率對比

1、前言 (1)最近在做資料傳輸時,由於接收的資料量較大,在字串拼接時使用了以前感覺方便的“+”進行字串拼接,最後拼接到最後時間越來越多,導致效率變慢。 2、String拼接 首先來看一下兩個String用“+”號拼接需要的時間 String aa="E0 00 00 00 00

圖解JavaString、StringBufferStringBuilder的區別

圖解Java中String、StringBuffer和StringBuilder的區別 參考部落格:https://blog.csdn.net/weixin_41101173/article/details/79677982 一、Java中的 String 類——String 是字串常量 1、字

JavaStringbyte[]間的轉換淺析

Java語言中字串型別和位元組陣列型別相互之間的轉換經常發生,網上的分析及程式碼也比較多,本文將分析總結常規的byte[]和String間的轉換以及十六進位制String和byte[]間相互轉換的原理及實現。 1. String轉byte[] 首先我們來分析一下常規的Strin

Bip44確定性演算法的Java實現庫(Androidjava平臺都可以使用)

簡介 這是一個Bip44確定性演算法的Java實現庫(Android和java平臺,都可以使用),可以生成12個助記詞,seed種子和根據path路徑生成路徑的私鑰. 對Bip44確定演算法不瞭解的可以看我之前的一篇文章:區塊鏈開發之確定性演算法bip32,bip39,b

javaString new String還有物件String字串在記憶體的儲存

一直以來,所有人都說,java中的String型別是不可變的,可是為什麼不可變確很少有人說的透徹,String和new String的區別,物件中的String和直接定義一個String是否有區別,一直都是一知半解。看了很多文件都是各種猜測,沒有具體程式碼來