国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

01 編譯期

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

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

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

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處編譯失敗:

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

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

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

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

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

CONSTANT_Utf8_info {

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

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

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

關于這一點,在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中,所有需要保存在常量池中的數據,長度最大不能超過65535,這當然也包括字符串的定義咯。

02 運行期

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

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

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

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)
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116443
  • 字符串
    +關注

    關注

    1

    文章

    596

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    開源鴻蒙技術大會2025丨編譯器與編程語言分論壇:語言驅動系統創新,編譯賦能生態繁榮

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

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

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

    關于伺服電纜長度問題的詳解

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

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

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

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

    企業級Java環境越來越復雜,真正的破局點,可能不在“人”,而在于“工具”。5個實用建議,幫你理清Java工具的選型思路。
    的頭像 發表于 09-11 13:59 ?1499次閱讀
    <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長度限制,怎么去擴大它的
    發表于 09-11 06:28

    如何使TC1796運行在RAM?

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

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

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

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

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

    ArkUI-X平臺橋接Bridge說明

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

    EtherCAT運動控制卡應用開發教程之Java

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

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

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

    Java 到 Go:面向對象的巨人與云原生的輕騎兵

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

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

    關于線束導向長度的定義,定義了適當的、準確的導線長度,可用于線束制造。
    的頭像 發表于 03-27 11:46 ?1270次閱讀