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. }  
  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/timssd/p/6700294.html
Copyright © 2011-2022 走看看