bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

java中的String定義的字面量較大長度是多少-創新互聯

本篇文章給大家分享的是有關java中的String定義的字面量較大長度是多少,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創新互聯專注于邱縣企業網站建設,響應式網站開發,成都商城網站開發。邱縣網站建設公司,為邱縣等地區提供建站服務。全流程按需網站建設,專業設計,全程項目跟蹤,創新互聯專業和態度為您提供的服務

java的String對象底層是有字符數組存儲的,理論上char[] 較大長度是int的較大值

思路:

首先,String字面常量是由String類來維護的,并且在編譯時就可以確定(具體請參考String常量池)。因而,如果String字面常量存在一個較大的長度(目前暫且假設),而我們使用的字面常量又超過了這個極限,那么,在編譯期間,編譯器就能夠給出錯誤信息。因此,我們可以使用IO流生成Java文件,文件的內容就是聲明一個String對象,然后使用字面常量賦值,根據動態編譯結果,調整字面常量的長度,最后得出字面常量的較大長度值

根據以下代碼得出結論(代碼來自書《Java深入解析:透析Java本質的36個話題 》):

import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.io.OutputStream; import javax.tools.JavaCompiler;import javax.tools.ToolProvider; public class LiteralLength {  public static void main(String[] args) throws Exception { String fileName = "D:/Literal.java"; StringBuilder prefix = new StringBuilder(); prefix.append("public class Literal{ String s = \""); int low = 0; int high = 100_0000; int mid = (low + high)/2; StringBuilder literal = new StringBuilder(high);  int result;  String ch = "A"; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); //自定義錯誤輸出流 取代System的err OutputStream err = new OutputStream() {    @Override  public void write(int b) throws IOException {      } };  int max = 0; for (int i = 0; i < mid; i++) {  literal.append(ch); } while(low <= high){  StringBuilder fileContent         = new StringBuilder(literal.length() + prefix.length() * 2);  fileContent.append(prefix);  fileContent.append(literal);  fileContent.append("\";}");  FileWriter w = new FileWriter(fileName);  BufferedWriter bw = new BufferedWriter(w);  bw.write(fileContent.toString());  bw.close();  w.close();//生成java文件  result = compiler.run(null, null, err, fileName);    //代碼點的數量  int codePointCount = literal.codePointCount(0, literal.length());  if(result == 0){//0表示沒有編譯錯誤  low = mid + 1;  mid = (low + high)/2;  max = codePointCount;  for (int i = codePointCount; i < mid; i++) {   literal.append(ch);  }  System.out.println("長度" + max             + "編譯成功,增加長度至" + mid);    }else{  //編譯錯誤,說明字面量太長  high = mid - 1;  mid = (low + high)/2;  System.err.println("長度" + codePointCount             + "編譯失敗,減少長度至" + mid);  int start = ch.length() == 1? mid : mid *2;  literal.delete(start, literal.length());  } } err.close(); System.out.println("較大字面量長度:" + max);   }}

輸出結果:

長度500000編譯失敗,減少長度至249999長度249999編譯失敗,減少長度至124999長度124999編譯失敗,減少長度至62499長度62499編譯成功,增加長度至93749長度93749編譯失敗,減少長度至78124長度78124編譯失敗,減少長度至70311長度70311編譯失敗,減少長度至66405長度66405編譯失敗,減少長度至64452長度64452編譯成功,增加長度至65428長度65428編譯成功,增加長度至65916長度65916編譯失敗,減少長度至65672長度65672編譯失敗,減少長度至65550長度65550編譯失敗,減少長度至65489長度65489編譯成功,增加長度至65519長度65519編譯成功,增加長度至65534長度65534編譯成功,增加長度至65542長度65542編譯失敗,減少長度至65538長度65538編譯失敗,減少長度至65536長度65536編譯失敗,減少長度至65535長度65535編譯失敗,減少長度至65534較大字面量長度:65534

但是若 修改代碼

String ch = "α";

結論 :較大字面量長度:32767

若 String ch = "字";

較大字面量長度:21845

在class文件中,使用CONSTANT_Utf8_info表來存放各種常量字符串,包括String字面常量,類或接口的全限定名,方法及變量的名稱、描述符等。CONSTANT_Utf8_info表的結構如表 所示。

從表3-1可知,CONSTANT_Utf8_info表使用2字節來表示字符串的長度,因此,bytes數組的較大長度為216?1,即65535字節。可是,為什么4個字符(“A”、“á”、“字”與“㊣”)的運行結果各不相同呢?原因在于,在CONSTANT_Utf8_info表中,從“\u0001”~“\u007f”,bytes使用1字節來表示,空字符(null,即“\u0000”)和從“\u0080”~“\u07ff”,使用2字節來表示,從“\u0800”~“\uffff”,使用3字節來表示,而對于增補字符,即代碼點范圍在“U+10000”~“U+10FFFF”之間的字符,使用6字節來表示。也可以這樣認為,增補字符是使用一個代理對來表示的,而代理對的取值范圍為“\ud800”~“\udfff”,這些字符都在“\u0800”~“\uffff”之間,每個代理字符使用3字節表示,共6字節。上述的存儲是在class文件中的實現,不要與Java程序中的字符相混淆,對于Java程序來說,“A”、“á”、“字”都使用一個char類型變量表示,即2字節,而“[插圖]”(增補字符)使用兩個char類型變量表示,即4字節。

String字面常量的較大長度與String在內存中的較大長度是不一樣的,后者的較大長度為int類型的較大值,即2147483647,而前者根據字符(字符Unicode值)的不同,較大長度也不同,較大長度為65534(可手動修改class文件,令輸出結果為65535)。

String字面常量的較大長度是由CONSTANT_Utf8_info表來決定的,該長度在編譯時確定,如果超過了CONSTANT_Utf8_info表bytes數組所能表示的上限,就會產生編譯錯誤。

以上就是java中的String定義的字面量較大長度是多少,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創新互聯行業資訊頻道。

分享文章:java中的String定義的字面量較大長度是多少-創新互聯
分享URL:http://vcdvsql.cn/article12/jiidc.html

成都網站建設公司_創新互聯,為您提供品牌網站制作網頁設計公司外貿建站網站策劃動態網站定制網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管