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