首页 > 代码库 > 不可变的字符串(String)

不可变的字符串(String)

        一个字符串String对象一旦被配置,其内容就是固定不可变的(immutable)。如下声明:

      String str = "windows";


       这个声明会配置一个长度为11的字符串对象,您无法改变它的内容。看到下面的内容,我们别理所当然地认为就是改变一个字符串对象的内容:

      String str = "java";
      str = "javascript";


      事实上,在段代码中有两个字符串对象,一个是"java",长度为4,一个是"javascript",长度为10。这两个是不同的字符串对象,您并不是在 "java"字符串后加上"script"字符串,而是令str名称指向新的字符串对象,如下所示:

    原来指向此
    str ----> "java"

    重新指定后

    str-----> "javascript"
    引用新的字符串对象


      在Java中,使用 = 将一个字符串对象指定给一个名称,其意义为改变名称的引用对象,原来的字符串对象若没有其它名称来引用它,就会适时地被Java的“垃圾回收”(Garbage collection)机制回收, 如若在程序中使用下面的方式声明,则就是指向同一个字符串对象:

    String str1 = "number";
    String str2 = "number";
    System.out.println(str1 == str2);


      代码的执行结果会显示true。在Java中会维护一个String Pool,对于一些可共享的字符串对象,会先在String Pool中查找是否存在字节相同的String内容,如果有就直接传回,而不是直接建立一个新的String对象,以减少内存的耗用。

  注意到了吗?== 运算在Java中被用来比较两个名称是否指向同一对象,所以不可以用==来比较两个字符串的内容是否相同,例如:

    String str1 = new String("cubic");
    String str2 = new String("cubic");
    System.out.println(str1 == str2);


  上面会显示false的结果,因为str1与str2是分别指向不同的字符串对象,如果要比较两个(字符串)对象是否相同,您要使用equals()方法,例如:

    String str1 = new String("cubic");
    String str2 = new String("cubic");
    System.out.println(str1.equals(str2));


  这样子结果才会显示所想要的比较结果:true。