zoukankan      html  css  js  c++  java
  • 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的不可变性导致字符串变量使用+号的代价很大。

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

  • 相关阅读:
    Tuesday / Wednesday = Increased Response
    脚本语言
    py2exe
    脚本语言
    访问者模式
    C调用lua脚本的效率测试
    Python编码规范
    py2exe
    Python编码规范
    访问者模式
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/javaString.html
Copyright © 2011-2022 走看看