??初看到這個問題心里還是有點尷尬的,平時確實沒注意過String最大能有多長。想要知道String到底有多長,只能從源碼層面來找答案了。
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)玉溪免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
??Java中String不是基本數(shù)據(jù)類型,而是引用類型并且是final。String定義為final的原因:
?? 高效性
??JVM在查找字符串的時候可以直接定位到String類中,更準(zhǔn)確的說String不可變,才能實現(xiàn)常量池。
?? 安全性
??定義成final,不能被繼承和修改,可以防止在子類或者其他地方被修改,導(dǎo)致隱藏Bug產(chǎn)生。
??上面提到常量池,JVM創(chuàng)建對象是需要開銷的,為了提高性能,對字符串使用字符串常量池進(jìn)行了優(yōu)化,每當(dāng)我們創(chuàng)建一個字符串時,Jvm先去字符串常量池檢查,如果字符串常量池存在,直接返回實例引用;否則創(chuàng)建實例,并存入字符串常量池中。
??比如常見的判斷:
因為a和b都是指向"hello"這個常量池中的常量,即同一個地址所以a==b 為true
因為c是new了一個新對象,且對象是在堆上存放,所以c==a為false,雖然c的內(nèi)容是創(chuàng)建在堆中,但是他的內(nèi)部value還是指向JVM常量池的hello的value,它構(gòu)造hello時所用的參數(shù)依然是hello字符串常量。
??下面正式進(jìn)入今天的主題了,String的最大長度到底是多大呢?
??翻開String類的源碼,你會看到:
可以看到String的length是通過count值返回的,count是int型,最大為2 31 -1,所以String理論上最大長度為2 31 -1,2147483647。
但是由于String底層是通過char[]字符數(shù)組來實現(xiàn),char占用兩個字節(jié),2147483647 個 char 類型就是 4294967294 字節(jié),這接近于 4GB 大小,想要申請這么一大塊連續(xù)的內(nèi)存空間,失敗也就不足為奇了,所以和電腦的硬件條件有關(guān)。
?? 總結(jié)
??String 的最大長度也就是字符數(shù)組的最大長度,理論上最大長度為 int 類型的最大值,即 2147483647。
??在實際中,一般可獲取的最大值小于理論最大值。
這取決于所使用的后端技術(shù)。例如,MySQL數(shù)據(jù)庫中,最大字符串長度可以設(shè)置為255或65535個字符,而MongoDB數(shù)據(jù)庫中,最大字符串長度可以設(shè)置為16M。因此,前端給后端最大字符串長度取決于后端環(huán)境,可以根據(jù)實際情況進(jìn)行設(shè)置。
1、字符串保存在字符變量中的大小是0~65535個字節(jié),一般不會超過最長允許值。
2、字符串主要用于編程,概念說明、函數(shù)解釋、用法詳述見正文,這里補(bǔ)充兩點:1.Free Pascal中的Ansistring只能看成整體,很多函數(shù)無法使用,就算是提取單個元素也很麻煩,所以除非萬不得已就不要用;2.字符串在存儲上類似字符數(shù)組,所以它每一位的單個元素都是可以提取的,如s=“abcdefghij”,則s[0]=“a”,s[9]="j",而字符串的零位正是它的長度,如s[0]=10(※上述功能Ansistring沒有。),這可以給我們提供很多方便,如高精度運(yùn)算時每一位都可以轉(zhuǎn)化為數(shù)字存入數(shù)組。
golang原生數(shù)據(jù)類型:按長度:int8(-128-127)、int16、int32、int64。
布爾型:布爾型的值只可以是常量true或者false。一個簡單的例子:varbbool=true。
數(shù)字類型:整型int和浮點型float32、float64,Go語言支持整型和浮點型數(shù)字,并且支持復(fù)數(shù),其中位的運(yùn)算采用補(bǔ)碼。
字符串類型:字符串就是一串固定長度的字符連接起來的字符序列。Go的字符串是由單個字節(jié)連接起來的。Go語言的字符串的字節(jié)使用UTF-8編碼標(biāo)識Unicode文本。
派生類型:包括:(a)指針類型(Pointer)(b)數(shù)組類型?結(jié)構(gòu)化類型(struct)(d)Channel類型(e)函數(shù)類型(f)切片類型(g)接口類型(interface)(h)Map類型。