91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java的String編譯期和運行期的長度限制

汽車玩家 ? 來源:未知 ? 作者:李威 ? 2020-05-03 18:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這個問題要分兩個階段看,分別是編譯期和運行期。不同的時期限制不一樣。

01 編譯期

首先,我們先來合理的推斷一下,當我們在代碼中使用String s = "";的形式來定義String對象的時候,""中字符的個數(shù)有沒有限制呢?

既然是合理的推斷,那就要要足夠的依據(jù),所以我們可以從String的源碼入手,根據(jù)public String(char value[], int offset, int count)的定義,count是int類型的,所以,char value[]中最多可以保存Integer.MAX_VALUE個,即2147483647字符。(jdk1.8.0_73)

但是,實驗證明,String s = "";中,最多可以有65534個字符。如果超過這個個數(shù)。就會在編譯期報錯。

public static void main(String[] args) {

          String s = "a...a";// 共65534個a
          System.out.println(s.length());
          String s1 = "a...a";// 共65535個a
          System.out.println(s1.length());
}

以上代碼,會在String s1 = "a...a";// 共65535個a處編譯失?。?/p>

? javac StringLenghDemo.java
StringLenghDemo.java:11: 錯誤: 常量字符串過長

明明說好的長度限制是2147483647,為什么65535個字符就無法編譯了呢?

當我們使用字符串字面量直接定義String的時候,是會把字符串在常量池中存儲一份的。那么上面提到的65534其實是常量池的限制。

常量池中的每一種數(shù)據(jù)項也有自己的類型。Java中的UTF-8編碼的Unicode字符串在常量池中以CONSTANT_Utf8類型表示。

CONSTANTUtf8info是一個CONSTANTUtf8類型的常量池數(shù)據(jù)項,它存儲的是一個常量字符串。常量池中的所有字面量幾乎都是通過CONSTANTUtf8info描述的。CONSTANTUtf8_info的定義如下:

CONSTANT_Utf8_info {

     u1 tag;
     u2 length;
     u1 bytes[length];
}

由于本文的重點并不是CONSTANTUtf8info的介紹,這里就不詳細展開了,我們只需要我們使用字面量定義的字符串在class文件中,是使用CONSTANTUtf8info存儲的,而CONSTANTUtf8info中有u2 length;表明了該類型存儲數(shù)據(jù)的長度。

u2是無符號的16位整數(shù),因此理論上允許的的最大長度是2^16=65536。而 java class 文件是使用一種變體UTF-8格式來存放字符的,null 值使用兩個 字節(jié)來表示,因此只剩下 65536- 2 = 65534個字節(jié)。

關(guān)于這一點,在the class file format spec中也有明確說明:

The length of field and method names, field and method descriptors, and other constant string values is limited to 65535 characters by the 16-bit unsigned length item of the CONSTANTUtf8info structure (§4.4.7). Note that the limit is on the number of bytes in the encoding and not on the number of encoded characters. UTF-8 encodes some characters using two or three bytes. Thus, strings incorporating multibyte characters are further constrained.

也就是說,在Java中,所有需要保存在常量池中的數(shù)據(jù),長度最大不能超過65535,這當然也包括字符串的定義咯。

02 運行期

上面提到的這種String長度的限制是編譯期的限制,也就是使用String s= "";這種字面值方式定義的時候才會有的限制。

那么。String在運行期有沒有限制呢,答案是有的,就是我們前文提到的那個Integer.MAX_VALUE ,這個值約等于4G,在運行期,如果String的長度超過這個范圍,就可能會拋出異常。(在jdk 1.9之前)

int 是一個 32 位變量類型,取正數(shù)部分來算的話,他們最長可以有

2^31-1 =2147483647 個 16-bit Unicodecharacter
2147483647 * 16 = 34359738352 位
34359738352 / 8 = 4294967294 (Byte)
4294967294 / 1024 = 4194303.998046875 (KB)
4194303.998046875 / 1024 = 4095.9999980926513671875 (MB)
4095.9999980926513671875 / 1024 = 3.99999999813735485076904296875 (GB)
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3002

    瀏覽量

    116512
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    596

    瀏覽量

    23176
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    簡單高效的鴻蒙編譯提速技巧

    在鴻蒙應用開發(fā)中編譯構(gòu)建是開發(fā)者最頻繁的操作,每一次編譯提速都能顯著提升項目整體開發(fā)效率。本次分享幾個簡單卻高效的鴻蒙編譯提速技巧,從編譯配置、構(gòu)建方式等維度進行優(yōu)化,讓你的開發(fā)流程更
    的頭像 發(fā)表于 03-04 16:09 ?98次閱讀
    簡單高效的鴻蒙<b class='flag-5'>編譯</b>提速技巧

    開源鴻蒙技術(shù)大會2025丨編譯器與編程語言分論壇:語言驅(qū)動系統(tǒng)創(chuàng)新,編譯賦能生態(tài)繁榮

    在萬物智聯(lián)的時代背景下,操作系統(tǒng)底層能力的構(gòu)建離不開編程語言與編譯器的關(guān)鍵支撐。作為開源鴻蒙生態(tài)的核心技術(shù),語言設計與編譯器、虛擬機實現(xiàn)的進步直接關(guān)系到開發(fā)效率、運行性能與系統(tǒng)安全。本次分論壇聚焦
    的頭像 發(fā)表于 11-20 17:24 ?950次閱讀
    開源鴻蒙技術(shù)大會2025丨<b class='flag-5'>編譯</b>器與編程語言分論壇:語言驅(qū)動系統(tǒng)創(chuàng)新,<b class='flag-5'>編譯</b>賦能生態(tài)繁榮

    Arm Neoverse CPU上大代碼量Java應用的性能測試

    Java 是互聯(lián)網(wǎng)領(lǐng)域廣泛使用的編程語言。Java 應用的一些特性使其性能表現(xiàn)與提前編譯的原生應用(例如 C 程序)大相徑庭。由于 Java 字節(jié)碼無法直接在 CPU 上執(zhí)行,因此通常
    的頭像 發(fā)表于 11-05 11:25 ?782次閱讀
    Arm Neoverse CPU上大代碼量<b class='flag-5'>Java</b>應用的性能測試

    關(guān)于伺服電纜長度問題的詳解

    伺服電纜作為工業(yè)自動化系統(tǒng)中的關(guān)鍵組件,其長度問題直接影響設備性能與系統(tǒng)穩(wěn)定性。本文將圍繞伺服電纜長度對信號傳輸、電磁干擾、電壓降及安裝維護的影響展開深度解析,并提供專業(yè)解決方案。 一、電纜長度
    的頭像 發(fā)表于 11-01 07:40 ?1027次閱讀

    riscv virt64編譯后 ls無法運行怎么解決?

    用倉庫里的默認配置編譯qemu-virt64-riscv 生成后運行,顯示 [E/DBG] virtio-blk0 mount failed ls看不到文件夾 msh />ls No such directory
    發(fā)表于 09-22 06:38

    Java效率提升指南:5個Java工具選型建議及Perforce JRebel和XRebel介紹

    企業(yè)級Java環(huán)境越來越復雜,真正的破局點,可能不在“人”,而在于“工具”。5個實用建議,幫你理清Java工具的選型思路。
    的頭像 發(fā)表于 09-11 13:59 ?1562次閱讀
    <b class='flag-5'>Java</b>效率提升指南:5個<b class='flag-5'>Java</b>工具選型建議及Perforce JRebel和XRebel介紹

    cJSON_Parse返回為空,有長度限制是什么原因?

    cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated); } 我用的是CJSON軟件包 為什么這里解析的json長度限制,怎么去擴大它的
    發(fā)表于 09-11 06:28

    如何使TC1796運行在RAM?

    生成工具:DAvE2 目前我用同一份代碼,在HighTec選擇iROM的情況下,去進行編譯調(diào)試,可以正常的運行; 但在選擇iRAM的情況下,去編譯調(diào)試,調(diào)試日志顯示無法讀取DBGSR,這應該是出現(xiàn)了程序跑飛了; 從調(diào)試界面看,
    發(fā)表于 08-13 07:26

    STM32 CubeIDE編譯、運行(燒錄程序)的快捷鍵是什么?

    CubeIDE編譯運行(燒錄程序)的快捷鍵是什么?
    發(fā)表于 07-25 07:04

    六類線永久鏈路的長度不能超過多少米-科蘭

    ) 指綜合布線系統(tǒng)中固定安裝的部分,包括水平電纜、連接模塊(如信息插座、配線架)及中間連接點(CP點),不包括兩端跳線、測試設備插接件。其長度限制旨在確保信號傳輸質(zhì)量,避免因鏈路過長導致衰減、串擾等問題。 信道(Channel) 包含永久鏈路及兩端跳線(如設備跳線、工作區(qū)
    的頭像 發(fā)表于 07-14 10:09 ?1420次閱讀
    六類線永久鏈路的<b class='flag-5'>長度</b>不能超過多少米-科蘭

    ArkUI-X平臺橋接Bridge說明

    \\\\ java.util.HashMap NSDictionary 說明 1、S表示string、number、boolean類型; 2、Record表示<key, value>類型,key僅為string類型
    發(fā)表于 06-19 23:12

    EtherCAT運動控制卡應用開發(fā)教程之Java

    運動控制卡的Java開發(fā)及DLL調(diào)用
    的頭像 發(fā)表于 06-13 14:29 ?905次閱讀
    EtherCAT運動控制卡應用開發(fā)教程之<b class='flag-5'>Java</b>

    Java開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多Java開發(fā)者在用?

    Perforce JRebel是一款Java開發(fā)效率工具,旨在幫助java開發(fā)人員更快地編寫更好的應用程序。JRebel可即時重新加載對代碼的修改,無需重啟或重新部署應用程序,就能讓開發(fā)者即時看到代碼更改的效果,從而縮短開發(fā)、調(diào)試和測試周期,大大提升開發(fā)效率。
    的頭像 發(fā)表于 04-27 13:44 ?873次閱讀
    <b class='flag-5'>Java</b>開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多<b class='flag-5'>Java</b>開發(fā)者在用?

    Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵

    Go 語言在 2009 年被 Google 推出,在創(chuàng)建之初便明確提出了“少即是多(Less is more)”的設計原則,強調(diào)“以工程效率為核心,用極簡規(guī)則解決復雜問題”。它與 Java 語言生態(tài)
    的頭像 發(fā)表于 04-25 11:13 ?663次閱讀

    線束導線長度的定義有哪些?重要嗎?

    關(guān)于線束導向長度的定義,定義了適當?shù)?、準確的導線長度,可用于線束制造。
    的頭像 發(fā)表于 03-27 11:46 ?1312次閱讀