String长度为什么不可变?
 StringBuffer的长度为什么可变?

解决方案 »

  1.   

    这是系统定义的,String是一个固定长度的字符串,而StringBuffer是可以改变的,可以在后面追加字符串的。
      

  2.   

    String 是一个常量
    而StringBuffer内部维护了一个数组吧
      

  3.   

    你看src代码,他们分别属于用什么类型来存储不就知道了?
      

  4.   

    String 字符串是常量 不可以修改 
    而StringBuffer 是字符串变量  它的对象是可以进行修改 和扩充的 它可以设定容量大小的构造器
      

  5.   

    because string is final
      

  6.   

    String 是 final型  不可以改变  但是你可以 用 str = str+"";这种方式操作。
      

  7.   

    可以参照 String StringBuffer StringBuild的比较 地址 http://www.gbsou.com/2010/01/31/1979.html 
      

  8.   

    String定义的变量,在编译时,已经把值写到字节码里了(常量区),所以是不可变的
      

  9.   

    下面是JDK里提供的String类的部分源码,private final char value[];这一行表明String使用char型数组存储字符串的内容的,学过C语言的都知道,char[]位于占内存长度不可变,一旦定义即固定,楼上和七楼说法不确切,final型并非不可变,final型的属性可以通过其类的构造方法改变值,String就是用构造方法实现赋值的。不知道这样解释对不对
    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence
    {
        private final char value[];
        private final int offset;
        private final int count;
        private int hash; // Default to 0
        private static final long serialVersionUID = -6849794470754667710L;      private static final ObjectStreamField[] serialPersistentFields =
            new ObjectStreamField[0];
        public String() {
    this.offset = 0;
    this.count = 0;
    this.value = new char[0];
        }    public String(String original) {
    int size = original.count;
    char[] originalValue = original.value;
    char[] v;
       if (originalValue.length > size) {
          int off = original.offset;
                v = Arrays.copyOfRange(originalValue, off, off+size);
      } else {
          v = originalValue;
      }
    this.offset = 0;
    this.count = size;
    this.value = v;
        }
        //......
    }
      

  10.   

    可以参照 String StringBuffer StringBuild的比较 地址 http://www.gbsou.com/2010/01/31/1979.html
      

  11.   

    这个问为什么??Java内库这样去实现的  去读一下源码吧
      

  12.   

    final 和 C语言的const属性差不多。const char * 这种变量就不能通过它来修改内容了。恰好java吸收了这个优秀思想。又使用了JVM字符池,都是共享一个地址,so String 变成了一个固址变量。不能通过这个指针修改它的地址值。因为那个地址别人也在用。但是有为了反复的字符串拼接操作,又写了那个StringBuffer 。
      

  13.   

    13楼:final型的属性可以通过其类的构造方法改变值确切地说是初始化,并不是改变值(之前并没有值)。final类型的变量的值是不能够改变的
      

  14.   

    String 字符串是常量;它们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享它们
    而StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
      

  15.   

    这个东西最好看API 那里得解释是最权威 最具信服力的
      

  16.   

    不建议lz用str = str+“XXXX”的方式
    那样浪费堆地址
    str是final类型的
    它在栈里指向堆内定义好的字符串,比如str = “xu”
    那个堆内定义的字符串就是xu
    str指向xu
    如果你执行str = str+“XXXX”
    那么堆需要再次开辟一个“xuXXXX”的空间给你
    再让str指向xuXXXX
    原来还有一个“xu”
    这样内存就被浪费了
    stringbuffer是一个可变对象
    内部可以说有一个内存的池,默认长度为16个字节(或者16个字符大小,具体的忘记了,呵呵)
    stringbuffer的对象可以主动malloc和delete来完成扩充和缩减的工作
    于是其长度就可变了