在线观看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
    主站蜘蛛池模板: 最好看最新的中文字幕1 | 黄色网址网站在线观看 | 丁香啪啪天堂激情婷婷 | 黄频网| 三级天堂 | 亚洲综合激情另类专区 | 亚洲卡一卡2卡三卡4卡国色 | 边做饭边被躁欧美三级小说 | 2018天天操夜夜操 | 免费看曰批女人爽的视频网址 | 成 人 免费 网站 | 国产免费一区二区三区 | 日日噜噜夜夜狠狠久久丁香 | 日本在线观看永久免费网站 | www视频在线观看com | 国产你懂的视频 | 欧美一级精品高清在线观看 | 美女中出视频 | 一本一本大道香蕉久在线精品 | 天天干天天做 | 免费国产成高清人在线视频 | 狠狠色丁香婷婷综合橹不卡 | 天天躁天天爽 | 毛茸茸成熟妇女亚洲人 | 国产精品任我爽爆在线播放6080 | 性做久久久久久 | 天堂资源bt种子在线 | 免费福利片2022潦草影视午夜 | 亚洲黄网免费 | 色婷婷婷丁香亚洲综合不卡 | 久久久亚洲欧美综合 | 国产大片免费观看中文字幕 | 亚洲一区二区三区中文字幕5566 | 中国色老头 | va国产 | 美女毛片视频 | 欧美婷婷六月丁香综合色 | 国产一区二区三区波多野吉衣 | 天堂网在线最新版www | ts人妖系列在线专区 | 国产一级鲁丝片 |