String 详解

问题:

public class Test{
public static void changestr(String str){
str = "welcome";
}
public static void main(String []args)
{
String str = "1234";
changestr(str);
System.out.println(str);
}
}
输出结果为什么是 1234??

解答:

   这个主要涉及到String类型变量的不变性,private final char value[];String类中保存值得成员是这样定义的,所以在类存堆中new出一个String对象后该对象不能再改变。
  主函数中的str与changestr(String str)中的str是两个不同的引用,当调用函数时,把主函数中str引用指向的对象赋值给changestr(String str)中的str,即是changestr(String str)中str与主函数中的str指向同一个String对象,当函数中给str赋值是,由于String类型变量的不变性所以不是去改变"1234" (String str = "1234";)这个对象而是去创建另一个新的对象“welcome”(str = "welcome";),而changestr(String str)中的str这个引用指向它,而不是主函数中的str指向它,所以会出现这样的情况。
  对于String类型变量的赋值,遵循下面的规则,java中有String pool(我估计是由于String对象的不变性,所以java中有String pool)。
  java中有两种赋值方式,一种采用字面值方式的赋值,String s = "aaa"; 查找String pool中是否存在“aaa”这个对象,如果不存在,则在String pool 中创建一个"aaa"对象,然后将String pool中这个对象的地址返回给s这个引用,这样s会指向String pool 中"aaa"这个对象。如果String pool中已经有这个“aaa”对象时java虚拟机不会创建新的对象,而是将这个对象的地址直接返回。
  另一种方式是String s = new String("aaa"); 首先在String pool 中查找有没有这个对象,如果已经有了,则不再String pool中创建了,而是在堆中创建该对象,然后返回堆中该对象的地址。如果没有,则在String pool中创建该对象,并且在堆中也创建该对象,最后返回堆中该对象的地址给s。

 

ps:

在java中,说String是不可变的,可是为什么

假设String s=new String ("wo");String s1=new String("de");
s=s+s1;
System.out.println(s);结果为wode?
最佳答案
首先在栈中有个"s"变量指向堆中的"wo"对象...
栈中"s1"变量指向堆中的"de"对象
当执行到s = s + s1;
系统重新在堆中new一个更大的数组出来,然后将"wo"和"de"都复制进去,然后栈中的"s"指向这个新new出来的数组...
所谓的不可变是指:它没有在原数组“wo”上进行修改,而是新建了个更大数组进行扩展,也就是说,这时候堆里还是有“wo”
这个对象数组存在的,只不过这个时候"s"变量不在指向"wo"这个数组了,而是指向了新new出来的数组,这就是和StringBuffered的区别,
后者是在原数组上进行修改,改变了原数组的值,StringBuffered不是通过新new一个数组去复制,而是在原数组基础上进行扩展...再让
变量指向原数组....

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值