色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    2966

    瀏覽量

    104707
  • 字符串
    +關注

    關注

    1

    文章

    578

    瀏覽量

    20508
收藏 人收藏

    評論

    相關推薦

    對比Python與Java編程語言

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

    了解電源模塊運行限制

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

    java編譯能拿到源碼嗎

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

    java編譯的代碼可以修改么

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

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

    的平臺,Java可以用于開發桌面應用程序、移動應用程序、企業級應用程序等。 – Java Web是Java語言在Web開發領域的應用,它使用Java技術來構建動態的Web應用程序,這些
    的頭像 發表于 07-16 13:35 ?788次閱讀
    華納云:<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 ?8256次閱讀

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

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

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

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

    基于DE1-SOC的String Art實現

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

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

    String 對象用于處理文本(字符串)。
    的頭像 發表于 04-08 14:32 ?809次閱讀
    鴻蒙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 ?1201次閱讀
    【AWTK開源智能串口屏方案】MCU SDK使用與<b class='flag-5'>編譯</b><b class='flag-5'>運行</b>

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

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

    在長時間運行期間控制器如何適應PMSM的電機參數變化?

    你好,我正在為PMSM設計控制器,我有一個問題,在長時間運行期間,控制器如何適應PMSM的電機參數變化?
    發表于 01-22 06:35

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

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

    FlashDB在運行期間,如果發現存在壞塊flash會進行隔離處理嗎?

    FlashDB在運行期間,如果發現存在壞塊flash會進行隔離處理嗎? FlashDB是一種在運行期間可以進行壞塊隔離處理的數據庫系統。在本文中,我將詳細介紹FlashDB的相關特性、壞塊處理機
    的頭像 發表于 01-17 11:05 ?2457次閱讀
    主站蜘蛛池模板: 亚洲AV一宅男色影视| 亚洲精品偷拍影视在线观看| 91进入蜜桃臀在线播放| 久久精品日本免费线| 伊人久久亚洲精品一区| 噜妇插内射精品| 99这里只有是精品2| 日韩欧美国产免费看清风阁| 国产成人免费高清在线观看| 午夜伦理在线观看| 精品久久久久久久高清| xx在线观看| 久久久精品久久| 小寡妇水真多好紧| 99九九免费热在线精品| 精品手机在线视频| 四虎精品久久久久影院| 97在线观看成人免费视频| 国产午夜精品久久久久九九| 妻子撸av中文字幕| 在线中文字幕| 特黄大片aaaaa毛片| 一级毛片皇帝 宫女| 国产三级在线观看视频| 亚洲.日韩.欧美另类| 精品国产免费观看久久久| 99E久热只有精品8在线直播| 忘忧草直播| 欧美特级午夜一区二区三区| 九九热在线视频| 国产久久re6免费热在线| a视频在线免费观看| 亚洲综合色婷婷在线影院| 特黄特色大片免费播放器9| 欧美色妞AV重囗味视频| 精品无码一区二区三区中文字幕 | 亚洲精品在线看| 宿舍BL 纯肉各种PLAY H| 欧美.亚洲.日韩.天堂| 久就热视频精品免费99| 九色PORNY丨视频入口|