public class a{
public static void main(String []wo){
String my=new String("xie");
my=my.concat("tao");//为什么能这样 不是说String类的对象的内容是不可以改变的吗
System.out.println(my);
}
}
public static void main(String []wo){
String my=new String("xie");
my=my.concat("tao");//为什么能这样 不是说String类的对象的内容是不可以改变的吗
System.out.println(my);
}
}
String my=new String("xie");
//此时串my指向对象"xie"
my=my.concat("tao");//为什么能这样 不是说String类的对象的内容是不可以改变的吗 此时串my已不是指向对象"xie",而是指向新的串对象"xietao",原来的老的串对象"xie"没有变化,只不过my不再指向它了。
my=my.concat("tao"); //为什么能这样 不是说String类的对象的内容是不可以改变的吗
System.out.println(my); //这是因为:你在进行my=my.concat("tao"); 的时候,在堆内存中重新复制了一份内存空间,这个内存空间存放"xietao"
//这个字符串,实际上,现在在堆内存已经存在了两份"xie"这一字符串,只不过你把"xietao"这块内存的首地址送给了变量my
//而你原来的字符串"xie"已经成为垃圾内存(没有被任何一个对象所指向),所以说字符串是不可变的,要记好了!!!!!!
第二个位置 是一个String pool。 如果你直接使用 String my = "xie"; my 对象是放在 String pool中的。 如果使用new 关键字
的话 两处地方都会存放my对象。 每创建一个String的对象 都会查找这个 String Pool, 如果有的话直接引用,没有的话再创建。
所以 String对象的内容是不可改的, 如果表现出来改了的话 一定是 引用变了。 不信的话 你直接打印出 my对象, 肯定不是同一个
对象。 1L 说的是正确的
是这个意思吗
而堆区my对象 一开始是存储的"xie"的地址 后来 才变成了 "xietao"的地址 哦 只是指向变了
my = my + "tao";