Immutable Strings 字符串对象不可变

来源:互联网 发布:怎么通过网络赚钱 编辑:程序博客网 时间:2024/06/01 10:21

1、字符串操作,几乎是计算机程序中最频繁的活动之一。

    无论你写什么程序,总能看到它的身影。

2、对于这样的对象,太忙了,不再安排新活让它干,哪么让它单独存在吧!

      设置:1》final 类,不继承,无子类。

                2》对象也是不可变,如果原对象的数据要加工,哪么建立一个新对象,

                    里面的数据,初始化时建立,对象活着的时间总和数据绑定在一起,不能改,只能看一下或复制一份

3、final 类,主要功能:只存数据,不存在一个String 对象和另一个对象相连。

     1》   private final char value[]:只有在建立String 对象时赋值,就再不变了。

     2》String qq = upcase(q);

         upcase(String s) :方法参数里面的String s只是一个空实例变量,等待别人传入值,但是从方法的初始化来说,应该在堆栈本地变量中,分配了一个4个字节,什么也不    放, 等待别人传一个地址过来,而且方法初始化应该是在运行时,对象才开始调用方法。

                 s=q 地址相同,指向同一对象,所以不建立新的String s对象。

                       哪么 就相当把String q对象取一个别名s,所以堆中没有建立任何数据。

    3》s=q 指向同一对象,执行 s.toUpperCase(),执行过程中主要是这句,会复制对象的值放入char[] 中。

       System.arraycopy(value, 0, result, 0, firstLower);

        value:就是对象的值。

         char[] result = new char[len]; //原始的字符数组,把值复制到这里面。

         return new String(result, 0, len + resultOffset); 进行转换,形成一个新字符串

4、例子     

package str;
import static net.mindview.util.Print.*;

public class Immutable {
public static String upcase(String s) {
return s.toUpperCase();
}
public static void main(String[] args) {
String q = "howdy";
print(q); // howdy
String qq = upcase(q);
print(qq); // HOWDY
print(q); // howdy
}
}

   upcase:原始地址复制一份给函数 s,

 1、q:literal 值(固定值)入inter池

 2、qq:变量  值在堆中

               图一:表示拷贝q的地址给 s,两个共用一个对象howdy       图二:表示upcase把数据改成大写,形成新的对象,放入堆中。