String类型的特殊之处

  String是一种特殊的引用类型,那么它究竟特殊在哪里?

  请看看下面这个程序,输出什么结果?

public static void changeStr(String str) {
    str = "welcome";
}
public static void main(String[] args) {
    String str = new String("1234");    //使用String str = "1234";是一样的效果
    changeStr(str);
    System.out.println(str);
}

答案是:1234

解释:

  String作为参数的传递方式是引用传递,但是String又有值传递的效果。这是因为String是常量,不能更改,所以如果在函数里更改的话,其实是生成了另外一个String,但是原来的String还在,函数外的String还是原来的String。函数里的String指向另外一个新生成的String,给人一种值传递的假象

  String a = "aaa"; //==> a----->new String("aaa")
  String b = a; //==> b----->a, 传引用
  b = "bbb"; //==> b----->new String("bbb"), 传引用,b指向了一个新的字符串,a并没有变。


  有一种解释:String是一个引用类型,在栈上保持引用,在堆上(确切地说:是在字符串区)保持数据。说法不同,意思一样。

  可以看看《java中特殊的String类型》这一篇,其中有

  String是不可改变类记:基本类型的包装类都是不可改变的)的典型代表,也是Immutable设计模式的典型应用,String变量一旦初始化后就不能更改,禁止改变对象的状态,从而增加共享对象的坚固性、减少对象访问的错误,同时还避免了在多线程共享时进行同步的需要。

  Immutable模式的实现主要有以下两个要点:
    1.除了构造函数之外,不应该有其它任何函数(至少是任何public函数)修改任何成员变量。
    2.任何使成员变量获得新值的函数都应该将新的值保存在新的对象中,而保持原来的对象不被修改。

  String的不可变性导致字符串变量使用+号的代价很大。

  原创文章,欢迎转载,转载请注明出处!