Java把以0结尾的字符串_Java中字符串为什么不以\0结尾
其實(shí)這個(gè)問題沒有什么好說的,Java里面一切都是對(duì)象,是對(duì)象的話,字符串肯定就有長(zhǎng)度,即然有長(zhǎng)度,編譯器就可以確定要輸出的字符個(gè)數(shù),當(dāng)然也就沒有必要去浪費(fèi)那1字節(jié)的空間用以標(biāo)明字符串的結(jié)束了。
學(xué)過C/C++的人都有一種固定的思維模式,凡是字符串都是以\0結(jié)束,其實(shí)C++中未必,不信你查查string這個(gè)泛型類,為了與C語(yǔ)言兼容性,它里面有一個(gè)方法c_str()就是返回以\0結(jié)束的字符串。
下面是C++/C代碼
char str[]=”test”;//這個(gè)占5個(gè)字節(jié)
為什么是5個(gè)字節(jié),因?yàn)镃語(yǔ)言的標(biāo)準(zhǔn)輸出函數(shù)printf對(duì)字符串進(jìn)行輸出時(shí),會(huì)判斷當(dāng)前字符是不是\0,如果是\0的話,就停止輸出。不信,你可以看看Linux下的Vsprintf.c這個(gè)文件
Java中:
char []str=”test”;//編譯都通不過
char []str=new char[10];//這樣才行,也就是直接指定了其大小
在java中數(shù)組其實(shí)就是一個(gè)對(duì)象,學(xué)習(xí)java時(shí),我們都接觸的一句話就是everythingis object,因此數(shù)組也不例外,數(shù)組對(duì)象里還有一個(gè)屬性叫做length,就是數(shù)組的長(zhǎng)度,因此對(duì)于輸出函數(shù)來說,有直接的大小可以判斷字符串的邊界,編譯器就沒必要再去浪費(fèi)一個(gè)空間標(biāo)識(shí)字符串的結(jié)束。
Java中的String類
如下String str=”test”;為什么不能/0作為結(jié)束呢,其實(shí)上面也說了,String類里面本身就有方法length()可以確定字符串的長(zhǎng)度,因些輸出時(shí)完全可以根據(jù)這個(gè)長(zhǎng)度來輸出,當(dāng)我們調(diào)用
System.out.println(str),看源碼的話,真正調(diào)用的是如下這個(gè)函數(shù):
代碼:
public?void?write(String?str,?int?off,?int?len)?throws?IOException?{
synchronized?(lock)?{
char?cbuf[]
//如果長(zhǎng)度小于1K的話;
if?(len?<=?writeBufferSize)?{
if?(writeBuffer?==?null)?{//如果writeBuffer屬于第一次使用,還沒申請(qǐng)緩存空間時(shí)
writeBuffer?=?new?char[writeBufferSize];
}
cbuf?=?writeBuffer;
}//大于1K的話
else?{??//?Don't?permanently?allocate?very?large?buffers.
cbuf?=?new?char[len];
}//將str存入緩存,這里看到了沒,這個(gè)的len就是字符串的長(zhǎng)度
str.getChars(off,?(off?+?len),?cbuf,?0);
write(cbuf,?0,?len);//向控制臺(tái)寫
}
}
總結(jié)
以上是生活随笔為你收集整理的Java把以0结尾的字符串_Java中字符串为什么不以\0结尾的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 系统参数优化方法_Mysql
- 下一篇: Java基础类库四则运算_00JAVA语