這篇文章主要介紹了String在java中定義的字面量最大長(zhǎng)度是多少,創(chuàng)新互聯(lián)小編覺(jué)得不錯(cuò),現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨創(chuàng)新互聯(lián)小編來(lái)看看吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、睢寧縣網(wǎng)站維護(hù)、網(wǎng)站推廣。
Java是一門面向?qū)ο缶幊陶Z(yǔ)言,可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序。
首先,String字面常量是由String類來(lái)維護(hù)的,并且在編譯時(shí)就可以確定(具體請(qǐng)參考String常量池)。因而,如果String字面常量存在一個(gè)最大的長(zhǎng)度(目前暫且假設(shè)),而我們使用的字面常量又超過(guò)了這個(gè)極限,那么,在編譯期間,編譯器就能夠給出錯(cuò)誤信息。因此,我們可以使用IO流生成Java文件,文件的內(nèi)容就是聲明一個(gè)String對(duì)象,然后使用字面常量賦值,根據(jù)動(dòng)態(tài)編譯結(jié)果,調(diào)整字面常量的長(zhǎng)度,最后得出字面常量的最大長(zhǎng)度值
根據(jù)以下代碼得出結(jié)論(代碼來(lái)自書《Java深入解析:透析Java本質(zhì)的36個(gè)話題 》):
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(); //自定義錯(cuò)誤輸出流 取代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表示沒(méi)有編譯錯(cuò)誤 low = mid + 1; mid = (low + high)/2; max = codePointCount; for (int i = codePointCount; i < mid; i++) { literal.append(ch); } System.out.println("長(zhǎng)度" + max + "編譯成功,增加長(zhǎng)度至" + mid); }else{ //編譯錯(cuò)誤,說(shuō)明字面量太長(zhǎng) high = mid - 1; mid = (low + high)/2; System.err.println("長(zhǎng)度" + codePointCount + "編譯失敗,減少長(zhǎng)度至" + mid); int start = ch.length() == 1? mid : mid *2; literal.delete(start, literal.length()); } } err.close(); System.out.println("最大字面量長(zhǎng)度:" + max); } }
輸出結(jié)果:
長(zhǎng)度500000編譯失敗,減少長(zhǎng)度至249999
長(zhǎng)度249999編譯失敗,減少長(zhǎng)度至124999
長(zhǎng)度124999編譯失敗,減少長(zhǎng)度至62499
長(zhǎng)度62499編譯成功,增加長(zhǎng)度至93749
長(zhǎng)度93749編譯失敗,減少長(zhǎng)度至78124
長(zhǎng)度78124編譯失敗,減少長(zhǎng)度至70311
長(zhǎng)度70311編譯失敗,減少長(zhǎng)度至66405
長(zhǎng)度66405編譯失敗,減少長(zhǎng)度至64452
長(zhǎng)度64452編譯成功,增加長(zhǎng)度至65428
長(zhǎng)度65428編譯成功,增加長(zhǎng)度至65916
長(zhǎng)度65916編譯失敗,減少長(zhǎng)度至65672
長(zhǎng)度65672編譯失敗,減少長(zhǎng)度至65550
長(zhǎng)度65550編譯失敗,減少長(zhǎng)度至65489
長(zhǎng)度65489編譯成功,增加長(zhǎng)度至65519
長(zhǎng)度65519編譯成功,增加長(zhǎng)度至65534
長(zhǎng)度65534編譯成功,增加長(zhǎng)度至65542
長(zhǎng)度65542編譯失敗,減少長(zhǎng)度至65538
長(zhǎng)度65538編譯失敗,減少長(zhǎng)度至65536
長(zhǎng)度65536編譯失敗,減少長(zhǎng)度至65535
長(zhǎng)度65535編譯失敗,減少長(zhǎng)度至65534
最大字面量長(zhǎng)度:65534
但是若 修改代碼
String ch = "α";
結(jié)論 : 最大字面量長(zhǎng)度:32767
若 String ch = "字";
最大字面量長(zhǎng)度:21845
在class文件中,使用CONSTANT_Utf8_info表來(lái)存放各種常量字符串,包括String字面常量,類或接口的全限定名,方法及變量的名稱、描述符等。CONSTANT_Utf8_info表的結(jié)構(gòu)如表 所示。
從表3-1可知,CONSTANT_Utf8_info表使用2字節(jié)來(lái)表示字符串的長(zhǎng)度,因此,bytes數(shù)組的最大長(zhǎng)度為216?1,即65535字節(jié)??墒?,為什么4個(gè)字符(“A”、“á”、“字”與“㊣”)的運(yùn)行結(jié)果各不相同呢?原因在于,在CONSTANT_Utf8_info表中,從“\u0001”~“\u007f”,bytes使用1字節(jié)來(lái)表示,空字符(null,即“\u0000”)和從“\u0080”~“\u07ff”,使用2字節(jié)來(lái)表示,從“\u0800”~“\uffff”,使用3字節(jié)來(lái)表示,而對(duì)于增補(bǔ)字符,即代碼點(diǎn)范圍在“U+10000”~“U+10FFFF”之間的字符,使用6字節(jié)來(lái)表示。也可以這樣認(rèn)為,增補(bǔ)字符是使用一個(gè)代理對(duì)來(lái)表示的,而代理對(duì)的取值范圍為“\ud800”~“\udfff”,這些字符都在“\u0800”~“\uffff”之間,每個(gè)代理字符使用3字節(jié)表示,共6字節(jié)。上述的存儲(chǔ)是在class文件中的實(shí)現(xiàn),不要與Java程序中的字符相混淆,對(duì)于Java程序來(lái)說(shuō),“A”、“á”、“字”都使用一個(gè)char類型變量表示,即2字節(jié),而“[插圖]”(增補(bǔ)字符)使用兩個(gè)char類型變量表示,即4字節(jié)。
String字面常量的最大長(zhǎng)度與String在內(nèi)存中的最大長(zhǎng)度是不一樣的,后者的最大長(zhǎng)度為int類型的最大值,即2147483647,而前者根據(jù)字符(字符Unicode值)的不同,最大長(zhǎng)度也不同,最大長(zhǎng)度為65534(可手動(dòng)修改class文件,令輸出結(jié)果為65535)。
String字面常量的最大長(zhǎng)度是由CONSTANT_Utf8_info表來(lái)決定的,該長(zhǎng)度在編譯時(shí)確定,如果超過(guò)了CONSTANT_Utf8_info表bytes數(shù)組所能表示的上限,就會(huì)產(chǎn)生編譯錯(cuò)誤。
以上就是創(chuàng)新互聯(lián)小編為大家收集整理的String在java中定義的字面量最大長(zhǎng)度是多少,如何覺(jué)得創(chuàng)新互聯(lián)網(wǎng)站的內(nèi)容還不錯(cuò),歡迎將創(chuàng)新互聯(lián)網(wǎng)站推薦給身邊好友。
當(dāng)前題目:String在java中定義的字面量最大長(zhǎng)度是多少
當(dāng)前鏈接:http://muchs.cn/article2/gdohic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、域名注冊(cè)、定制開(kāi)發(fā)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)