在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    2974

    瀏覽量

    104977
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20578
收藏 人收藏

    評論

    相關推薦

    Java 23功能介紹

    Java 23 包含全新和更新的 Java 語言功能、核心 API 以及 JVM,同時適合新的 Java 開發者和高級開發者。從?IntelliJ IDEA 2024.2?開始已支持 Java
    的頭像 發表于 12-04 10:02 ?329次閱讀
    <b class='flag-5'>Java</b> 23功能介紹

    對比Python與Java編程語言

    使得編寫代碼更加靈活,但也可能導致運行時錯誤。 Java 語法相對冗長,需要顯式聲明變量類型,增加了代碼的可讀性和安全性。 靜態類型系統在編譯時進行類型檢查,減少了運行時錯誤。 二、性
    的頭像 發表于 11-15 09:31 ?410次閱讀

    了解電源模塊運行限制

    電子發燒友網站提供《了解電源模塊運行限制.pdf》資料免費下載
    發表于 09-24 11:13 ?0次下載
    了解電源模塊<b class='flag-5'>運行</b><b class='flag-5'>限制</b>

    java編譯能拿到源碼嗎

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

    java編譯的代碼可以修改么

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

    華納云:java web和java有什么區別java web和java有什么區別

    的平臺,Java可以用于開發桌面應用程序、移動應用程序、企業級應用程序等。 – Java Web是Java語言在Web開發領域的應用,它使用Java技術來構建動態的Web應用程序,這些
    的頭像 發表于 07-16 13:35 ?869次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別

    hdmi線長度不能超過多少米

    HDMI線長度限制主要與其版本和實際應用場景中的信號衰減有關。以下是對HDMI線長度限制的詳細解釋: HDMI 1.3版本: 最長長度:2
    的頭像 發表于 06-24 10:17 ?9360次閱讀

    IDF-4.4.2在修改boot過程中,編譯有提示bootloader受到partition-table offset的限制,為什么?

    我在 IDF-4.4.2在修改boot過程中,編譯有提示bootloader受到partition-table offset的限制,如下圖 可當我用menuconfig修改后,發現從0XC000
    發表于 06-14 06:27

    為什么我的項目Debug運行沒問題,編譯成Release包就報錯?

    引言 在Android開發中,debug包和release包的行為差異可能導致release包在運行時出現問題,而這些問題在debug包中不會出現。 本文主要介紹debug包和release包的差異
    的頭像 發表于 06-12 11:18 ?1144次閱讀
    為什么我的項目Debug<b class='flag-5'>運行</b>沒問題,<b class='flag-5'>編譯</b>成Release包就報錯?

    如何利用實時示波器測量線纜長度

    在電子工程、通信和自動化控制等領域,線纜長度的準確測量對于保證系統的正常運行至關重要。實時示波器作為一種功能強大的電子測量工具,除了能夠觀測和分析各種波形信號外,結合時域反射(Time-Domain
    的頭像 發表于 05-27 16:24 ?1497次閱讀

    基于DE1-SOC的String Art實現

    String Art起源于19世紀的數學家Mary Everest Boole的設計,隨后發展成一種利用釘子和線進行作畫的藝術,主要是通過線的稠密度來表現不同的圖案。
    的頭像 發表于 04-09 11:02 ?521次閱讀
    基于DE1-SOC的<b class='flag-5'>String</b> Art實現

    鴻蒙TypeScript學習第10天:【String(字符串)】

    String 對象用于處理文本(字符串)。
    的頭像 發表于 04-08 14:32 ?869次閱讀
    鴻蒙TypeScript學習第10天:【<b class='flag-5'>String</b>(字符串)】

    【AWTK開源智能串口屏方案】MCU SDK使用與編譯運行

    本篇文章將介紹AWTK-HMI中的MCU端開發方法,包括MCUSDK常用API的說明、使用流程及如何編譯到Linux和STM32平臺。引言:AWTK-HMI是基于AWTK與AWTK-MVVM開發的低
    的頭像 發表于 02-19 12:11 ?1294次閱讀
    【AWTK開源智能串口屏方案】MCU SDK使用與<b class='flag-5'>編譯</b><b class='flag-5'>運行</b>

    使用Tasking編譯器生成的map文件中沒有變量的字節長度,這個怎么解決?

    使用Tasking編譯器生成的map文件中沒有變量的字節長度,請問這個怎么解決?
    發表于 02-04 09:24

    PSOC Creator和IAR編譯生成的hex,怎么更改每行數據長度

    PSOC4 芯片,PSOC Creator 導入IAR的工程,編譯后生成的hex 每行64個字節, 怎么改成16個字節, 客戶的hex轉bin的工具只識別16個字節長度的hex
    發表于 02-02 06:38
    主站蜘蛛池模板: 日本一区二区三区欧美在线观看 | 噜噜噜噜天天狠狠 | 7777色鬼xxxx欧美色夫 | 天堂资源在线种子资源 | 日本三级欧美三级香港黄 | www.亚洲天堂.com | 成人午夜剧场 | 激情五月开心婷婷 | 啪啪调教所29下拉式免费阅读 | 51vv福利视频在线精品 | 欧美性色xo影院69 | 你懂在线 | 欧美ggg| 亚洲成人99 | 麻豆三级视频 | 五月婷婷在线视频观看 | 五月天情网 | 高清视频一区二区 | yy6080三级理论韩国日本 | 免费看黄色片网站 | 国内精品久久久久久影院老狼 | 中文字幕一区在线播放 | 中文字幕一二三四区2021 | 四虎影院最新 | 午夜影院一区二区三区 | 午夜影院网页 | 国内激情自拍 | 国产日本三级在线播放线观看 | 色视频免费 | 亚洲人成www在线播放 | 日本午夜视频 | 日本免费xxxx色视频 | tube 69sex 第一次 | 欧美一级日韩一级亚洲一级 | 最新福利网站 | 国产午夜久久影院 | 国产在线视频你懂得 | 一本到在线观看视频不卡 | 午夜免费免费啪视频观看 | 久久香蕉国产线看观看精品yw | 亚洲男人天堂岛 |