精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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
    +關注

    關注

    19

    文章

    2958

    瀏覽量

    104550
  • 字符串
    +關注

    關注

    1

    文章

    577

    瀏覽量

    20485
收藏 人收藏

    評論

    相關推薦

    java編譯能拿到源碼嗎

    在語法和風格上有所不同的代碼,因為它們主要關注于恢復代碼的邏輯結構,而不是精確復制原始代碼的每個細節。 1. 反編譯的基本原理 Java程序在編譯時,源代碼(.java文件)會被
    的頭像 發表于 09-02 11:03 ?731次閱讀

    java編譯的代碼可以修改么

    Java編譯是一種將編譯后的Java字節碼(.class文件)轉換回源代碼的過程。反編譯后的代碼可以進行修改,但是需要注意,反
    的頭像 發表于 09-02 11:00 ?514次閱讀

    XMC Pinout Tool是否可以不受限制地使用免費的Java版本運行

    我有幾個關于 XMC 引腳排列工具的問題。 首先我想問一下 XMC Pinout Tool 是否可以不受限制地使用免費的 Java 版本(Oracle Java SE v17 LTS)運行
    發表于 01-22 06:18

    java環境配置成功后怎么運行

    命令編譯Java源文件,生成字節碼文件(.class后綴); 使用java命令運行生成的字節碼文件。 例如,我們有一
    的頭像 發表于 12-06 15:57 ?2050次閱讀

    java環境配置成功后能執行哪些操作

    Java環境配置成功后,您可以進行以下操作: 編寫和運行Java程序:配置成功后,您可以使用Java編寫程序,運行并測試它們。您可以使用任何
    的頭像 發表于 12-06 15:55 ?722次閱讀

    idea如何運行main方法

    運行main方法是指在Java程序中執行main方法來啟動程序 在Java編程中,main方法是每個Java應用程序的入口點。它是程序的起始點,程序從這里開始執行。為了
    的頭像 發表于 12-06 14:58 ?3530次閱讀

    idea的java運行配置怎么弄

    Java是一種跨平臺的編程語言,可以通過Java虛擬機(JVM)在不同的操作系統和硬件上運行。在運行Java程序之前,需要進行一些配置。本文
    的頭像 發表于 12-06 14:04 ?2056次閱讀

    eclipse設置java運行環境

    在Eclipse中設置Java運行環境是非常重要的,它能夠確保你的代碼能夠正確地編譯運行。下面介紹如何設置Java
    的頭像 發表于 12-06 11:29 ?1479次閱讀

    eclipse怎么運行java項目

    在Eclipse中運行Java項目是非常簡單的。下面了解一下如何在Eclipse中運行Java項目。 首先,確保您已經在Eclipse中創建了Jav
    的頭像 發表于 12-06 11:25 ?1952次閱讀

    java怎么限制輸入數字的范圍

    Java中,你可以使用循環和條件語句來限制輸入數字的范圍。下面我將詳細介紹如何實現這一功能。 首先,你需要使用Java的輸入輸出庫來接收用戶的輸入。Java中提供了Scanner類來
    的頭像 發表于 11-30 16:07 ?1561次閱讀

    java switch case 能不能用字符串

    支持也有一些限制。 在使用字符串作為switch語句的表達式時,可以通過使用String類型的值來判斷。下面是一個簡單的示例,展示了如何在Java中使用字符串的switch語句: String
    的頭像 發表于 11-30 14:46 ?1971次閱讀

    bigdecimal轉string類型避免空指針

    Java中,BigDecimal是用于處理高精度數字計算的類。它提供了一種有效的方法來避免使用浮點數的精確度損失問題。然而,在將BigDecimal對象轉換為String類型時,需要特別小心以避
    的頭像 發表于 11-30 11:12 ?2556次閱讀

    怎么把bigdecimal轉成string

    將BigDecimal轉換為String是一項常見的任務,在Java的開發中經常會涉及到將數值進行格式化,并在不同的環境中傳遞。本文將詳解以下幾個方面的內容: 什么是BigDecimal
    的頭像 發表于 11-30 11:11 ?1214次閱讀

    bigdecimal轉string類型

    將BigDecimal轉換為String類型是在Java編程中常常遇到的一個問題。BigDecimal是Java中用于表示高精度十進制數的類,而String則是用于表示文本字符串的數據
    的頭像 發表于 11-30 11:09 ?6294次閱讀

    rt-thread系統運行期改變網卡配置

    忘記在哪個論壇問題里回答過這個了,rtt 配置 DHCP 或者靜態 ip 是靜態配置的。它只能在 menuconfig 或者 setting 的時候,或選擇 DHCP 編譯或選擇 靜態 ip編譯,系統運行起來以后如果想開啟或關閉
    的頭像 發表于 11-28 17:05 ?1089次閱讀