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