首先我們先看一下這個問題:“Java語言中字符串“學(xué)Java”所占的內(nèi)存空間是幾個字節(jié)?”,要回答這個問題我們就必須先要清楚什么是“字節(jié)”什么是“字符”。
字節(jié)(Byte):字節(jié)是通過網(wǎng)絡(luò)傳輸信息(或在硬盤或內(nèi)存中存儲信息)的單位。字節(jié)是計算機信息技術(shù)用于計量存儲容量和傳輸容量的一種計量單位,1個字節(jié)等于8位二進制,它是一個8位的二進制數(shù),是一個很具體的存儲空間。
字符:人們使用的記號,抽象意義上的一個符號。 '1',
'中',
'a',
'$',
'¥',
……
談到字符就不得不提ANSI及UNICODE兩種不同的編碼方式標(biāo)準(zhǔn)(對這兩種編碼方式標(biāo)準(zhǔn)在此我只簡單提一下,如果大家有興趣可以自己去查一下),ANSI中的字符采用8bit,而UNICODE中的字符采用16bit。(對于字符來說ANSI以單字節(jié)存放英文字符,以雙字節(jié)存放中文等字符,而Unicode下,英文和中文的字符都以雙字節(jié)存放)Unicode碼也是一種國際標(biāo)準(zhǔn)編碼,采用二個字節(jié)編碼,與ANSI碼不兼容。
ANSI規(guī)定:一個小于127的字符的意義與原來相同,但兩個大于127的字符連在一起時,就表示一個漢字,前面的一個字節(jié)(他稱之為高字節(jié))從0xA1用到
0xF7,后面一個字節(jié)(低字節(jié))從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼里,我們還把數(shù)學(xué)符號、羅馬希臘的字母、日文的假名們都編進去了,連在
ASCII
里本來就有的數(shù)字、標(biāo)點、字母都統(tǒng)統(tǒng)重新編了兩個字節(jié)長的編碼,這就是常說的"全角"字符,而原來在127號以下的那些就叫"半角"字符了。從
UNICODE
開始,無論是半角的英文字母,還是全角的漢字,它們都是統(tǒng)一的"一個字符"!同時,也都是統(tǒng)一的"兩個字節(jié)"。
我們可以簡單的記這樣一個結(jié)論:按照ANSI編碼標(biāo)準(zhǔn),標(biāo)點符號、數(shù)字、大小寫字母都占一個字節(jié),漢字占2個字節(jié)。按照UNICODE標(biāo)準(zhǔn)所有字符都占2個字節(jié)。
我們再來看一下字符串,由于字符有2種編碼標(biāo)準(zhǔn),所以字符串也分為2種。
字符串(ANSI):在內(nèi)存中,如果“字符”是以
ANSI
編碼形式存在的,一個字符可能使用一個字節(jié)或多個字節(jié)來表示,那么我們稱這種字符串為 ANSI
字符串或者多字節(jié)字符串。
字符串(UNICODE):在內(nèi)存中,如果“字符”是以在
UNICODE
中的序號存在的,那么我們稱這種字符串為 UNICODE
字符串或者寬字節(jié)字符串。
由于不同 ANSI
編碼所規(guī)定的標(biāo)準(zhǔn)是不相同的,因此,對于一個給定的多字節(jié)字符串,我們必須知道它采用的是哪一種編碼規(guī)則,才能夠知道它包含了哪些“字符”。而對于
UNICODE
字符串來說,不管在什么環(huán)境下,它所代表的“字符”內(nèi)容總是不變的。
至此我們在上面提出的問題就迎刃而解了,因為在Java當(dāng)中字符是采用Unicode編碼標(biāo)準(zhǔn)的,所以“學(xué)Java”這個字符串在Java語言中占10個字節(jié)。
|