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),看源码的话,真正调用的是如下这个函数:

代码:

  1. public void write(String str, int off, int len) throws IOException {
  2. synchronized (lock) {
  3. char cbuf[]
  4. //如果长度小于1K的话;
  5. if (len <= writeBufferSize) {
  6. if (writeBuffer == null) {//如果writeBuffer属于第一次使用,还没申请缓存空间时
  7. writeBuffer = new char[writeBufferSize];
  8. }
  9. cbuf = writeBuffer;
  10. }//大于1K的话
  11. else {  // Don't permanently allocate very large buffers.
  12. cbuf = new char[len];
  13. }//将str存入缓存,这里看到了没,这个的len就是字符串的长度
  14. str.getChars(off, (off + len), cbuf, 0);
  15. write(cbuf, 0, len);//向控制台写
  16. }
  17. }

最新文章

  1. Linux shell运算符
  2. [Node.js] BDD和Mocha框架
  3. [poj3274]排排站(Hash)
  4. WordPress HOOK机制原理及代码分析
  5. Troubleshooting JDK
  6. java之io之file类的常用操作
  7. Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value 解决处理
  8. Codeforces Round #306 (Div. 2) C. Divisibility by Eight 暴力
  9. 老毛桃U盘启动盘制作工具V20140501完美贡献版
  10. Android 自定义属性(attrs.xml,TypedArray)
  11. 页面打开直接执行a点击事件
  12. LeetCode——Length of Last Word
  13. Spark的误解-不仅spark是内存计算,hadoop也是内存计算
  14. qlikview 权限管理和sso集成
  15. 第16月第24天 find iconv sublime utf-8
  16. Ubungu 18.04安装MySQL 5.7.24
  17. js--阻止冒泡,捕获,默认行为
  18. 【转】内存分析工具 MAT 的使用
  19. JSP session过期时间(小记)
  20. 工具类之Mutex

热门文章

  1. HTML-完美解决父子元素的外边距重叠和高度塌陷问题
  2. jmeter参数化遇到的问题
  3. cycloneii LAB-wide signals
  4. Java-Shiro:Shiro
  5. 微信小程序连续旋转动画this.animation.rotate
  6. xml中的&lt;if&gt;和截取字符串
  7. C#获取七牛云token/删除七牛云图片接口
  8. Linux文件句柄数配置
  9. vue-cli# 项目结构
  10. css3之背景background-origin,background-clip,background-size