zoukankan      html  css  js  c++  java
  • 字符串在Java中由“reference”传递

    这是Java的经典问题。在stackoverflow上已经提出了许多类似的问题,并且有很多不正确/不完整的答案。如果你没有想太多,这个问题很简单。但如果你更多地考虑它,它可能会非常混乱。

    1.一个有趣且令人困惑的代码片段

    public  static  void main (String [ ] args ) { 
    	String x =  new  String (“ab” ); 
    	改变( x ); 
    	系统。出。println ( x ); 
    } 
     
    公共 静态 无效改变(字符串 X ) { 
    	X =  “CD” ; 
    }

    public static void main(String [] args){String x = new String(“ab”); (x)改变; 的System.out.println(X); public static void change(String x){x =“cd”; }

    它打印“ab”。

    在C ++中,代码如下:

    void change ( string & x ) { 
        x =  “cd” ; 
    } 
     
    int main (){ 
        string x =  “ab” ; 
        改变( x ); 
        cout << x << endl ; 
    }

    void change(string&x){x =“cd”; } int main(){string x =“ab”; (x)改变; cout << x << endl; }

    它打印“cd”。

    2.常见的令人困惑的问题

    x存储指向堆中“ab”字符串的引用。因此,当x作为参数传递给change()方法时,它仍然指向堆中的“ab”,如下所示:

    串通按引用

    因为java是按值传递,所以x的值是对“ab”的引用。当调用方法change()时,它会创建一个新的“cd”对象,而x现在指向“cd”,如下所示:

    string-pass-by-reference 2

    这似乎是一个非常合理的解释。他们很清楚Java始终是按值传递的。但这里有什么问题?

    3.代码到底是做什么的?

    上面的解释有几个错误。要轻松理解这一点,最好简要介绍一下整个过程。

    创建字符串“ab”时,Java会分配存储字符串对象所需的内存量。然后,将对象分配给变量x,该变量实际上被赋予对象的引用。此引用是存储对象的内存位置的地址。

    变量x包含对字符串对象的引用。x本身不是参考!它是一个存储引用(内存地址)的变量。

    Java只是按值传递。当x传递给change()方法时,将传递x(引用)值的副本。方法change()创建另一个对象“cd”,它有一个不同的引用。变量x更改其引用(“cd”),而不是引用本身。

    下图显示了它的真正功能。
    string-pass-by-reference 3

    4.错误的解释

    从第一个代码片段引发的问题与字符串不变性无关。即使String被StringBuilder替换,结果仍然相同。关键是变量存储引用,但不是引用本身!

    5.解决这个问题

    如果我们真的需要改变对象的值。首先,对象应该是可更改的,例如StringBuilder。其次,我们需要确保没有创建新对象并将其分配给参数变量,因为Java只是按值传递。

    public static void main(String[] args) {
    	StringBuilder x = new StringBuilder("ab");
    	change(x);
    	System.out.println(x);
    }
     
    public static void change(StringBuilder x) {
    	x.delete(0, 2).append(“cd” ); 
    }

    public static void main(String [] args){StringBuilder x = new StringBuilder(“ab”); (x)改变; 的System.out.println(X); public static void change(StringBuilder x){x.delete(0,2).append(“cd”); }

  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/liclBlog/p/15349543.html
Copyright © 2011-2022 走看看