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