99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

01 編譯期

首先,我們先來合理的推斷一下,當(dāng)我們在代碼中使用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處編譯失?。?/p>

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

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

當(dāng)我們使用字符串字面量直接定義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的介紹,這里就不詳細(xì)展開了,我們只需要我們使用字面量定義的字符串在class文件中,是使用CONSTANTUtf8info存儲的,而CONSTANTUtf8info中有u2 length;表明了該類型存儲數(shù)據(jù)的長度。

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

關(guān)于這一點,在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,這當(dāng)然也包括字符串的定義咯。

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

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109734
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    590

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    ArkUI-X平臺橋接Bridge說明

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

    線束導(dǎo)線長度的定義有哪些?重要嗎?

    關(guān)于線束導(dǎo)向長度的定義,定義了適當(dāng)?shù)?、?zhǔn)確的導(dǎo)線長度,可用于線束制造。
    的頭像 發(fā)表于 03-27 11:46 ?454次閱讀

    使用OpenVINO?條件編譯功能,壓縮Windows應(yīng)用體積

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

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

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

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

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

    Triton編譯器在機器學(xué)習(xí)中的應(yīng)用

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

    Java 23功能介紹

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

    深入了解Java泛型——從前世今生到PECS原則

    元素?”的問題,也會出現(xiàn)感嘆Java的泛型限制太多了很難用的情況。 為了更好的使用泛型,就需要更深地了解它,因此本文主要介紹泛型誕生的前世今生,特性,以及著名PECS原則的由來。 泛型的誕生 背景 在沒有泛型之前,必須使用Object編寫適用于多種類
    的頭像 發(fā)表于 11-21 11:45 ?536次閱讀
    深入了解<b class='flag-5'>Java</b>泛型——從前世今生到PECS原則

    對比Python與Java編程語言

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

    Java中時間戳的使用

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

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

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

    了解電源模塊運行限制

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

    java編譯能拿到源碼嗎

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

    java編譯的代碼可以修改么

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

    三十分鐘入門基礎(chǔ)Go Java小子版

    前言 Go語言定義 Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發(fā)的一種靜態(tài)、強類型、編譯型語言。Go 語言
    的頭像 發(fā)表于 08-12 14:32 ?991次閱讀
    三十分鐘入門基礎(chǔ)Go <b class='flag-5'>Java</b>小子版