面试官:String的最大长度是多少?
之前有提到,指北君在做面試相關(guān)的事情。有面試官問(wèn)了String的最大長(zhǎng)度是多少?指北君聽(tīng)到這個(gè)問(wèn)題之后有點(diǎn)懵,還好指北君抗住了。
指北君:面試官你好,可以開(kāi)始面試了嗎?
面試官:你好,那我們現(xiàn)在開(kāi)始吧。之前我們聊了new object()到底占用多少個(gè)字節(jié)?看你對(duì)JVM有一定的了解。那我今天問(wèn)問(wèn)你,一個(gè) String 字符串最大長(zhǎng)度是多少?
指北君:從我們平常使用的角度看,String 字符串似乎是沒(méi)有長(zhǎng)度限制。所以也不存在最大長(zhǎng)度這個(gè)事情。
面試官:真的這樣嗎?是這樣的話(huà),我們今天可以結(jié)束了。不用再聊了。
指北君:那等等,我想一下。
指北君大腦中瘋狂搜索 String 源代碼的相關(guān)內(nèi)容。
指北君終于在String 源碼中找到了蛛絲馬跡,
public String(char value[], int offset, int count) {if (offset < 0) {throw new StringIndexOutOfBoundsException(offset);}if (count <= 0) {if (count < 0) {throw new StringIndexOutOfBoundsException(count);}if (offset <= value.length) {this.value = "".value;return;}}// 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);}指北君:我記得String 源碼中有個(gè)構(gòu)造函數(shù),有個(gè)count的參數(shù)是int類(lèi)型的。在Java 中,int的最大長(zhǎng)度是2^31-1。也就是說(shuō) String 的長(zhǎng)度最大是2^31-1。
面試官:嗯,沒(méi)錯(cuò),這個(gè)是理論上的長(zhǎng)度吧,實(shí)際情況能達(dá)到嗎?
指北君又陷入了沉思…… 開(kāi)始計(jì)算起存這么大的String需要消耗多大的內(nèi)存。
指北君:我剛才在腦子里算了下,存儲(chǔ)長(zhǎng)度2^31-1的字符串需要4GB的內(nèi)存,也就是說(shuō),我們需要有大于4GB的JVM運(yùn)行內(nèi)存才行。
2^31-1)*2*16/8/1024/1024/1024 = 4GB面試官:既然你已經(jīng)提到了JVM,那String一般都存儲(chǔ)在JVM的哪塊區(qū)域。
指北君:字符串在JVM中的存儲(chǔ)分兩種情況,我上面說(shuō)的String ,它是存儲(chǔ)在JVM的堆棧中。另外還有字符串常量存儲(chǔ)在常量池里面。
面試官:那你覺(jué)得常量池中的字符串最大長(zhǎng)度是2^31-1嗎?
指北君:Java中字符串在常量池中通過(guò)CONSTANT_Utf8類(lèi)型表示。
CONSTANT_Utf8_info {u1 tag;u2 length;u1 bytes[length]; }指北君:我們只要重點(diǎn)關(guān)注bytes[length]即可,length在這里就是代表字符串的長(zhǎng)度,length的類(lèi)型是u2,u2是無(wú)符號(hào)的16位整數(shù),也就是說(shuō)最大長(zhǎng)度可以做到2^16-1 即 65535。
面試官:按照你說(shuō)的,我在我的機(jī)器上試了一下65535長(zhǎng)度的字符串,編譯報(bào)錯(cuò)了。這是怎么回事呢?
指北君:這是因?yàn)閖avac編譯器做了限制,需要length < 65535。所以字符串常量在常量池中的最大長(zhǎng)度是65534。你減少1個(gè)字符試試看。
面試官:這次編譯沒(méi)問(wèn)題了。我們今天就先到這里吧。
指北君:好的,我的offer,有戲嗎?
面試官:繼續(xù)努力鴨
總結(jié)
今天我們模擬面試了String的最大長(zhǎng)度問(wèn)題。結(jié)論是String是有長(zhǎng)度限制的,但是不同的狀態(tài)下,具有不同的長(zhǎng)度限制。
- 字符串常量長(zhǎng)度不能超過(guò)65534
- 堆內(nèi)字符串的長(zhǎng)度不超過(guò)2^31-1
總結(jié)
以上是生活随笔為你收集整理的面试官:String的最大长度是多少?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工具类用得好,下班下的早
- 下一篇: 理解HTTP协议中的multipart/