zoukankan      html  css  js  c++  java
  • Java中字符串为什么不以结尾

    Java中字符串为什么不以结尾

    其实这个问题没有什么好说的,Java里面一切都是对象,是对象的话,字符串肯定就有长度,即然有长度,编译器就可以确定要输出的字符个数,当然也就没有必要去浪费那1字节的空间用以标明字符串的结束了。

    学过C/C++的人都有一种固定的思维模式,凡是字符串都是以结束,其实C++中未必,不信你查查string这个泛型类,为了与C语言兼容性,它里面有一个方法c_str()就是返回以结束的字符串。

    下面是C++/C代码

    char str[]=”test”;//这个占5个字节

    为什么是5个字节,因为C语言的标准输出函数printf对字符串进行输出时,会判断当前字符是不是,如果是的话,就停止输出。不信,你可以看看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),看源码的话,真正调用的是如下这个函数:

    代码:

    [java] view plain copy
     
    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. }  
  • 相关阅读:
    在VC中设置某些文件不参加编译的方法
    VC7/VC8开发的库在VC6中的使用问题转载
    *.tar.bz2文件解压
    设置VC工程为Debug或Releas版本的方法
    Linux下设置环境变量命令export
    Source insight中设置字体方法
    双系统或虚拟机中与主机时间不一致解决方法
    制作启动光盘方法
    Linux下nfs服务器搭建
    ghost的备份与恢复转载
  • 原文地址:https://www.cnblogs.com/timssd/p/6700294.html
Copyright © 2011-2022 走看看