sql int 转string_由String引发的思考
最近在研究GO語言,其中提到?字符串就是一串固定長度的字符連接起來的字符序列。則由此產生聯想,在JVM中String的長度限制是多少?而且在實際應用(智慧社區)中也遇到過相似場景:前端同學將圖片轉碼成Base64的形式用字符串存儲到后端,然后運行時再轉回來。雖然這么做有點奇葩,但是存在即合理吧。今天,就來談一下這個String在JVM中到底有沒有限制。
JVM中STRING的存儲
String其實是使用一個char類型的數組來存儲字符串中的字符,其源碼如下:
public final class String ? ?implements java.io.Serializable, Comparable<String>, CharSequence { ? ?/** The value is used for character storage. */ ? ?private final char value[]; ? ? ? ?/** ? ? * Returns the length of this string. ? ? * The length is equal to the number of Unicode ? ? * code units in the string. ? ? * ? ? * @return the length of the sequence of characters represented by this ? ? * ? ? ? ? object. ? ? */ ? ?public int length() { ? ? ? ?return value.length; ? }}敲黑板!!!重點來了
數組的長度是int類型,Java中定義數組是可以給數組指定長度的,如果不指定,則默認根據數組元素來指定。
int[] arr = {1,2,3,4,5,6}int[] lenArr = new int[5]整數在java 中是有限制的,看這里或看以下源碼就可得知,int的最大限制為231 -1
public final class Integer extends Number implements Comparable<Integer> { ? ?/** ? ? * A constant holding the minimum value an {@code int} can ? ? * have, -231. ? ? */ ? ?@Native public static final int ? MIN_VALUE = 0x80000000; ? ?/** ? ? * A constant holding the maximum value an {@code int} can ? ? * have, 231-1. ? ? */ ? ?@Native public static final int ? MAX_VALUE = 0x7fffffff;}那么說明了數組的長度是0~231 -1,大約為4GB。
看到這兒是不是不太相信,我也不太信,讓事實來說話
再加一個字符
不是說好的4G嗎?怎么肥事?
public class TestString { ? ?final static String s = "" + ? ? ? ? ? ?"65534個字符串" +"1"+ ? ? ? ? ? ?""; ? ?public static void main(String[] args) { ? ? ? ?System.out.println(s.length()); ? ? ? ?System.out.println(s); ? }}因為我設置的是final類型 ,所以根據JVM規范,字面量形式的字符串,在編譯時會將其放在常量池中,這時候JVM對這個常量池存儲String類型做出了限制:
常量池中,每個 cp_info 項的格式必須相同,它們都以一個表示 cp_info 類型的單字節 “tag”項開頭。后面 info[]項的內容 由tag 的類型所決定。
我們看到String類型的表示是 CONSTANT_String ,我們來看下CONSTANT_String具體是如何定義的。
這里定義的 u2 string_index 表示的是常量池的有效索引,其類型是CONSTANT_Utf8_info 結構體表示的,這里我們需要注意的是其中定義的length我們看下面這張圖。
在class文件中u2表示的是無符號數占2個字節單位,我們知道1個字節占8位,2個字節就是16位 ,那么2個字節能表示的范圍就是2^16- 1 = 65535
所以總結如下:
字符串的內容是由一個字符數組 char[] 來存儲的,由于數組的長度及索引是整數,且String類中返回字符串長度的方法length() 的返回值也是int ,所以通過查看java源碼中的類Integer我們可以看到Integer的最大范圍是2^31 -1,由于數組是從0開始的,所以數組的最大長度可以使【0~231-1】通過計算是大概4GB。
但是通過翻閱java虛擬機手冊對class文件格式的定義以及常量池中對String類型的結構體定義我們可以知道對于索引定義了u2,就是無符號占2個字節,2個字節可以表示的最大范圍是216 -1 = 65535。其實是65535,但是由于JVM需要1個字節表示結束指令,所以這個范圍就為65534了。超出這個范圍在編譯時期是會報錯的,但是運行時拼接或者賦值的話范圍是在整形的最大范圍。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的sql int 转string_由String引发的思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福步怎么自定义头像_苹果手机怎么截屏 苹
- 下一篇: python function term