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把数据改成大写,形成新的对象,放入堆中。