欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

Java

當(dāng)前位置:主頁 > 軟件編程 > Java >

java中的String定義的字面量最大長度是多少

來源:本站原創(chuàng)|時間:2020-01-10|欄目:Java|點(diǎn)擊: 次

java的String對象底層是有字符數(shù)組存儲的,理論上char[]  最大長度是int的最大值,實際

思路:

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

根據(jù)以下代碼得出結(jié)論(代碼來自書《Java深入解析:透析Java本質(zhì)的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);
  
  //代碼點(diǎn)的數(shù)量
  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);
 
 
 }
}

 輸出結(jié)果:

長度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 = "α";

結(jié)論 : 最大字面量長度:32767

若  String ch = "字";

最大字面量長度:21845

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:簡單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別

欄    目:Java

下一篇:Java9 Stream Collectors新增功能(小結(jié))

本文標(biāo)題:java中的String定義的字面量最大長度是多少

本文地址:http://mengdiqiu.com.cn/a1/Java/8877.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有