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

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

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

3天內不再提示

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

? 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é)。

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

    關注

    20

    文章

    2987

    瀏覽量

    107235
  • 字符串
    +關注

    關注

    1

    文章

    589

    瀏覽量

    21166
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    使用OpenVINO?條件編譯功能,壓縮Windows應用體積

    ? 作者: 楊亦誠 英特爾 AI 軟件工程師 在 OpenVINO 編譯過程中,我們可以根據(jù)應用對于硬件平臺的需求,關閉或開指定推理后端的編譯,以達到簡化 OpenVINO 運行庫的目的,例如
    的頭像 發(fā)表于 01-13 10:26 ?493次閱讀
    使用OpenVINO?條件<b class='flag-5'>編譯</b>功能,壓縮Windows應用體積

    華為云 Flexus X 實例下的場景體驗——小企業(yè)必備——JAVA 環(huán)境搭建——保姆級教學

    前言 上次我們使用的是 Ubuntu 來操作的,這里跑的服務器多的還是 Huawei Cloud EulerOS,所以我們還原到基礎鏡像上做環(huán)境架設,此次我們來架設 java 的基礎運行環(huán)境,是能
    的頭像 發(fā)表于 01-07 17:05 ?445次閱讀
    華為云 Flexus X 實例下的場景體驗——小企業(yè)必備——<b class='flag-5'>JAVA</b> 環(huán)境搭建——保姆級教學

    Triton編譯器的優(yōu)化技巧

    在現(xiàn)代計算環(huán)境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優(yōu)化技術,以確保生成的代碼既高效又適應不同的硬件架構。 1. 指令
    的頭像 發(fā)表于 12-25 09:09 ?851次閱讀

    Triton編譯器在機器學習中的應用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務平臺的一部分,它負責將深度學習模型轉換為優(yōu)化的格式,以便在NVIDIA GPU上高效運行。Triton編譯
    的頭像 發(fā)表于 12-24 18:13 ?910次閱讀

    Java 23功能介紹

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

    對比Python與Java編程語言

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

    Java中時間戳的使用

    Java中時間戳的使用
    的頭像 發(fā)表于 11-06 16:04 ?471次閱讀
    <b class='flag-5'>Java</b>中時間戳的使用

    Keil編譯器優(yōu)化方法

    我們都知道,代碼是可以通過編譯器優(yōu)化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優(yōu)化選項。
    的頭像 發(fā)表于 10-23 16:35 ?1891次閱讀
    Keil<b class='flag-5'>編譯</b>器優(yōu)化方法

    了解電源模塊運行限制

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

    java編譯能拿到源碼嗎

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

    java編譯的代碼可以修改么

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

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

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

    【昉·星光 2 高性能RISC-V單板計算機體驗】移植IEC61850協(xié)議助力電子電子發(fā)展

    , IEC61850庫中的ICD文件需要一個JAVA工具來進行轉換,所以需要先安裝JAVA運行環(huán)境。下載java 解壓java壓縮包,并進入
    發(fā)表于 07-14 20:29

    HarmonyOS Next 原生應用開發(fā)-ArkTS語法適配背景說明

    ArkTS在保持TypeScript(簡稱TS)基本語法風格的基礎上,進一步通過規(guī)范強化靜態(tài)檢查和分析,使得在程序開發(fā)能檢測更多錯誤,提升程序穩(wěn)定性,并實現(xiàn)更好的運行性能。本文將進一步解釋為
    發(fā)表于 07-01 16:49

    hdmi線長度不能超過多少米

    HDMI線長度限制主要與其版本和實際應用場景中的信號衰減有關。以下是對HDMI線長度限制的詳細解釋: HDMI 1.3版本: 最長長度:2
    的頭像 發(fā)表于 06-24 10:17 ?1.3w次閱讀
    主站蜘蛛池模板: 99久久99久久久精品齐齐鬼色 | 高清视频一区 | 欧美黄一片 | 午夜剧场黄色 | 国产乱子伦一区二区三区 | mm131美女肉体艺术图片 | 国产香蕉98碰碰久久人人 | 五月天婷婷在线观看视频 | 色视频网站人成免费 | 久久久久88色偷偷 | 一区卡二区卡三区卡视频 | 国产三级日本三级韩国三级在线观看 | 久久国产精品免费 | 国产一二三区在线观看 | 亚洲欧洲色天使日韩精品 | 色多多免费观看 | sss在线play| 国产yw855.c免费观看网站 | 在线免费色 | www色视频| 日韩欧美亚洲一区 | 国产三级网站在线观看 | 日本免费一区二区老鸭窝 | 啪啪网免费视频 | 国产在线播 | 美女被啪到哭网站在线观看 | 69pao强力打造在线 | 色偷偷91久久综合噜噜噜 | ⅹxxxx68日本老师hd | 久久综合狠狠综合久久 | 色综合久久98天天综合 | 色片免费网站 | 国产日本三级在线播放线观看 | h小视频在线观看网 | 精品午夜久久影视 | 免费高清视频在线观看 | 亚洲国产精品久久久久婷婷软件 | fxxx性xxx性| 岛国三级在线看 | 亚洲欧美一区二区久久香蕉 | 性欧美xxx 不卡视频 |