文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JAVA中字符串和数组做参数传递的示例分析

2023-06-29 17:33

关注

这篇文章主要介绍JAVA中字符串和数组做参数传递的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

首先明确的一点就是在java中只有值传递!只有值传递!理论依据来自《think in java》。接下来就是具体说明为何java只有值传递。
因为java中有基本类型和引用类型两种数据类型,再加上String这个特殊的类型,所以主要从三个方面就行解释。

1. 基本数据类型

先看代码

public class Demo01 {        public void change(int a) {        System.out.println("副本a 的初始值" + a);        a = 20;        System.out.println("副本a 的新值值" + a);    }    public static void main(String[] args) {        int a = 10;        Demo01 d = new Demo01();        d.change(a);        System.out.println("change方法执行后的值" + a);    }}

分析:

在java中基本数据类型遵循值传递,所以对象d在调用change()方法时,只是将原数据a的副本传给方法中的参数,第一时间原本和副本a的值都是10,在执行到a=20后,副本a的值变成了20。

所以运行结果为:

JAVA中字符串和数组做参数传递的示例分析

原理参考下图

JAVA中字符串和数组做参数传递的示例分析

2. 引用数据类型

先看代码

public class Demo02 {    char[] ch = {'a', 'b', 'c'};    public void change(char ch[]) {        System.out.println("方法中ch[0]的初始值:" + ch[0]);        ch[0] = 'g';        System.out.println("方法中ch[0]执行后的新值:" + ch[0]);    }    public static void main(String[] args) {        Demo02 d = new Demo02();        System.out.println("对象d中数组的初始值是:"+d.ch);        d.change(d.ch);        System.out.println("对象d中数组的最终值是:"+d.ch);    }}

分析:

在引用类型作为参数进行传递时,也属于值传递,此时传递的是地址值副本,但是这两个地址指向同一个地方。在副本地址没有进行更改指向时,对副本地址指向的数据进行操作会影响到原始数据的值。方法中ch[] 数组和原始ch[]数组指向同一个数据,所以初始阶段ch[0]都指向’a’;接着对副本中的ch[0]进行新的赋值变为‘g’。
所以运行结果为:

JAVA中字符串和数组做参数传递的示例分析

原理参考下图

JAVA中字符串和数组做参数传递的示例分析

3. 字符串的参数传递

先看代码

public class Demo03 {    public void change(String str2) {        System.out.println("方法中str2初始值" + str2);        System.out.println("方法中str2初始hashcode值" + str2.hashCode());        str2 = "bbb";        System.out.println("方法中str2赋值后:" + str2);        System.out.println("方法中str2赋值后hashcode值:" + str2.hashCode());    }    public static void main(String[] args) {        String str1 = new String("aaa");        System.out.println("原始字符串str1的hashcode值:" + str1.hashCode());        Demo03 d = new Demo03();        d.change(str1);        System.out.println("方法调用后str1的值" + str1);    }}

分析:

字符串是一个特殊的数据类型,它的底层是一个final 型的char[]数组,属于无法更改,所以字符串在作为参数传递时,可以当做一个特殊的数组进行操作,同样的它也是将复制一份原本的对象引用给了副本,此时副本对象的引用和原本对象的引用都指向原始字符串的位置,也就是str2在刚开始初始化时它指向的地址和原对象str1指向的位置一致,即str2的初始hashcode值和原对象str1的hashcode值一样,str2经过str2=“bbb”操作后,由于字符串的不可变性,此时str2会指向一个新的对象引用,即此时str2指向“bbb”的位置。str2的hashcode值会变化,但是原本str1它的对象引用没有发生改变,并且“aaa”也未发生改变,所以str1仍然指向”aaa”。运行结果如下:

JAVA中字符串和数组做参数传递的示例分析

接下来看一个更具体的字符串例子:

public class Demo04 {    public static void main(String[] args) {        StringBuffer s = new StringBuffer("hello");        StringBuffer s2 = new StringBuffer("hi");        test(s, s2);        System.out.println("方法調用后s的值:" + s);        System.out.println("方法調用后s2的值:" + s2);    }    static void test(StringBuffer s3, StringBuffer s4) {        System.out.println("方法初始化時s3的值" + s3);        System.out.println("方法初始化時s4的值" + s4);        s4 = s3;        s3 = new StringBuffer("new");        System.out.println("第一步变化后s3的值" + s3);        System.out.println("第一步变化后s4的值" + s4);        s3.append("boy");        s4.append("gril");        System.out.println("第二步变化后s3的值" + s3);        System.out.println("第二步变化后s4的值" + s4);    }}

这次先看结果:
JAVA中字符串和数组做参数传递的示例分析

然后进行分析:

在未执行方法之前,字符串s1和s2指向的位置分别是“hello”和“hi”,这个毋容置疑,

(1)接着进入方法内部,方法中参数s3和s4初始化时和上面例子相同,此时它们和s1s2指向同一个位置,或者说s1s2将对象引用副本给了s3s4,此时s3s4的值为“hello”和“hi”

(2)接着执行s4=s3,这个操作就是将s3的对象引用给了s4,此时s4为“hello”;s3=new StringBuffer(”new”);这个操作要注意,此时相当于给了s3一个新的对象引用,s3指向一个字符串为“new”的位置,所以此时s3=“new”,s4=“hello”

(3)然后s3.append(“boy”);s4.append(“gril”);在StringBuffer中的append方法要注意,它的操作不会为s3s4指向一个新的对象引用,是在原来的基础上进行操作,因此操作完之后s3=“newboy”,s4=“hellogril”

(4)此时方法调用完,回头捋一下s3s4在此过程中的对s1s2的影响。
——- A . 首先是s3和s1一样刚开始指向“hello”,接着给s3创建一个新的对象引用“new”,此时s3和s1再无半毛钱关系,s3进行append(boy)后,s3=“newboy”;
——– B . s4刚开始和s2都指向“hi”,接着s3将自己初始值(也就是s1的副本)给了s4,此时s4指向“hello”(这会s4和s1有了关系),s4执行append(grill)操作,因为它和s1指向相同位置,所以它们的共同指向的对象会变化,s4=s1=“hellogrill”。
——- C .然后就清楚了,s2指向的对象“hi”并未变化,s1指向的“hello”在append(“grill”)操作下变成了“hellogril”。

4. 总结

以上是“JAVA中字符串和数组做参数传递的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯