Java中String的 "引用" 传递

摘要:
来解释一下这个过程首先,当字符串"ab"被创建时,Java分配内存来存储这个字符串常量;然后,这个字符串常量被赋值给了变量x,x实际上保存的是这个字符串对象的引用地址;x变量保存了字符串对象的引用,x并不是引用本身,它仅仅保存的是内存的引用地址;而在Java中,都是“值传递”;当x传递给change()方法时,实际上传递的是变量x的拷贝;change()方法又创建了一个新的字符串对象"cd",并赋值给了变量x的拷贝,"cd"对象的内存引用地址是不同的!

1、来看一段有趣但又让人困惑的代码片段

public static voidmain(String[] args){
        String x = new String("ab");
        change(x);
        System.out.println(x);
    }
    
    public static voidchange(String x){
        x = "cd";
    }

打印结果:"ab"

2、这段代码真正做了什么呢?来解释一下这个过程

首先,当字符串"ab"被创建时,Java分配内存来存储这个字符串常量;然后,这个字符串常量被赋值给了变量x,x实际上保存的是这个字符串对象的引用地址(内存中的地址);x变量保存了字符串对象的引用,x并不是引用本身,它仅仅保存的是内存的引用地址;

而在Java中,都是“值传递”;当x传递给change()方法时,实际上传递的是变量 x 的拷贝;change()方法又创建了一个新的字符串对象"cd",并赋值给了变量x的拷贝,"cd"对象的内存引用地址是不同的!

3、怎么解决这个问题呢?

如果我们确实希望改变这个对象。首先这个对象必须是可变的;第二,需要保证不会创建新的对象赋值给参数变量,因为Java仅仅是值传递

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

免责声明:文章转载自《Java中String的 "引用" 传递》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇什么是D-RAN, C-RAN, Cloud-RANQt下设置QLabel字体的大小和颜色下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【5】Redis从入门到放弃---秒杀案例(Redis的事务+锁机制+lua脚本)

(1)Redis的事务 1.1 Redis事务的定义: Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 1.2 Multi、Exec、discard命令 组队阶段:从输入multi命令开始,后面输入的任务命...

mailkit库收发邮件

mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库 环境  W10 / VS2017CMMT / MailKit version="2.0.3" "net46"  / MimeKit version="2.0.3" "net46" mailkit使用nuget下载或者到GIT  https://github.com/jstedfast/Mail...

Java(C#)基础差异-语法

1、long类型 Java long类型,若赋值大于int型的最大值,或小于int型的最小值,则需要在数字后加L或者l,表示该数值为长整数,如long num=2147483650L。 举例如下: public static void main(String[] args) { /* * 对于long类型,若赋值大于int型的最大...

poi解析office文档内容的工具类

第一步引入依赖 <!--xls--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId>...

Scala学习(八)---Scala继承

Scala继承 摘要: 在本篇中,你将了解到Scala的继承与Java和C++最显著的不同。要点包括: 1. extends、final关键字和Java中相同 2. 重写方法时必须用override 3. 只有主构造器可以调用超类的主构造器 4. 你可以重写字段 在本篇中,我们只探讨类继承自另一个类的情况。继承特质的内容后面会详细介绍 扩展类...

1,怎么获得数据库表结构。

1,在注入时初始化这两个模板。 /*** 注入数据源, 该数据源在Spring配置文件中配置* 在注入时初始化这两个模板* @paramdataSource* Method create author: yanwei* Method create dateTime: 2011-11-2 下午03:43:13* Method update autho...