最近在做项目时遇到一个List集合作为参数传递的问题,想起了以前总结的参数传递,参数传递包括值传递和引用传递,集合类的参数应该属于引用传递,脑子里突然就闪现到了数组,感觉数组也是一种特殊的集合,也应该是引用传递,于是就举了个简单的例子作为测试,但是测试结果大跌眼镜,数组居然没有实现像List集合那样的效果,现将问题罗列出来,请各位前辈指教,等问题解决后会做一下小结。问题如下

首先定义一个类Test1:

public class Test1 {

//这部分是针对list的操作,首先定义一个空的list集合容器

List list=null;

//用list集合容器作为参数的构造方法

public Test1(List list)

{

super();

this.list=list;

}

//对容器增加数据

public void putList(){

list.add("list1");

list.add("list2");

list.add("list3");

}

//------------------------------------------------------------------

//这部分是对数组的操作,首先定义一个空的数组

String[] str=null;

//用数组作为参数的构造方法

public Test1(String[] str)

{

this.str=str;

}

//对数组增加数据

public void putString()

{

str=new String[]{"string1"};

}

}

该类中分别定义了对List集合和数组Str的处理。对于List集合,首先定义一个List集合作为参数的集合,然后再通过方法putList()对集合进行数据增加,对于数据也做了类似的操作,然后定义一个操作类Test2:

public class Test2 {

//定义空的list集合以及数组

static List list=null;

static String[] str=null;

//返回一个list集合类型的数据

public static List getList()

{

List test=new ArrayList();

Test1 test1=new Test1(test);

test1.putList();

return test;

}

//返回一个数组类型的数据

public static String[] getString()

{

String[] test=new String[]{"string2"};

Test1 test1=new Test1(test);

test1.putString();

return test;

}

public static void main(String[] args)

{

//将getList()方法中得到的list集合传递给list,并显示其中的内容

list=getList();

for (Iterator iterator = list.iterator(); iterator.hasNext();)

{

System.out.println("List集合结果为:"+iterator.next().toString());

}

//将getString()方法中得到的数组传递给str,并显示其中的内容

str=getString();

for(int i=0;i

{

System.out.println("数组结果为:"+str[i]);

}

}

}

该类中分别定义了空的List集合和数组和得到各自类型的方法,然后在主方法中分别打印出List集合和数组中的值,结果如下:

List集合结果为:list1

List集合结果为:list2

List集合结果为:list3

数组结果为:string2

问题:List集合在作为参数传递的时候是地址引用传递,所以在类Test2的getList()方法中,定义的LIst类型的test作为参数传递为Test1的构造方法后通过this.list=list把test的地址给Test1中的成员变量list,再通过调用test1中的putList()方法对list进行添加数据,由于是地址引用所以也就改变了传过来的test的值,最终test的也增加了list1,list2,list3,再通过return test使方法返回一个增添了数据的List集合,最终赋值给Test2中的成员变量list并输出,得到结果,结果也是预料之内的,问题就在于对数组操作的结果,因为两个操作是一样的,在Test2的getString()方法中定义了一个数组test并且对其进行了赋值,再把它作为参数传递给Test1的构造方法,通过test1的putString()方法对其修改,这时test的值应该是修改后的值即:string1,但是输出来后还是原来的值string2,这不就成了值传递了吗,没有对数组进行改变?

问题解决方法:首先一点,List集合和数组作为参数时一定是进行地址引用传递的,但是自己在编写程序时出现了错误,在Test2中传入数组test后,Test1中的数组str指向这个数组,但是在类Test1中的putString()方法中,将数组str指向了一个新的数组地址,这样对str进行操作就不会影响到test了,所以在getString()方法中test是没有变化的,哎,写到这里,有想到了自己可怜的基础知识了,还是需要慢慢积累吧,加油!

java集合作为参数 传递的是_Java:数组和集合类作为参数传递时的差别相关推荐

  1. JAVA集合Set之HashSet详解_Java基础———集合之HashSet详解

    1.HashSet简介 Set是一个继承于Collection的接口,即Set也是集合中的一种.Set是没有重复元素的集合. HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素, ...

  2. Java 集合(List、Set)与数组(Arr)互转方法及注意事项,难怪《阿里开发手册》会如此重视

    原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 前言: 如果你现在正急于解决问题,请立刻.马上拉到本篇最后的[总结],进入"不废话环节". 通过本篇的学习,你将全面掌 ...

  3. js二维数组传递java,ActiveX获取JavaScript传递的二维数组

    此文参考了http://blog.csdn.net/playstudy/article/details/8259737,在此基础上做了改进 // WebDlg.idl : WebDlg 的 IDL 源 ...

  4. java string 内存占用_JVM系列之:String,数组和集合类的内存占用大小

    简介 之前的文章中,我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧. ...

  5. java怎么传入参数到方法当中_java中方法传入参数时:值传递还是址传递?

    JAVA中的数据类型有两大类型: ① 基本数据类型:逻辑型(boolean).文本型(char).整数型(byte.short.int.long).浮点型(float.double) ② 引用数据类型 ...

  6. java函数只有参数类不一样_java的函数参数传递

    java中只有一种参数传递方式:传值:这点和c++不一样,c++中有传值和引用两种方式.虽然java只有传值这 一种传递方式,但是根据参数类型的不同,函数对参数的影响也会不一样.可以这么说:形参是实参 ...

  7. java注解约束参数为固定值_java自定义注解的实现及属性设置

    java自定义注解,元注解的使用 ,元注解中值详解 元注解:用于注解注解的注解... 元注解共有4个: ①.@Target:用于明确注解用于目标类的哪个位置 ElementType枚举类的值: Typ ...

  8. java注解约束参数为固定值_Java学习 使用注解将参数的值限定

    前言 在Java的开发中,我们经常需要输入一些int或者String类型的值,而这些值可能仅仅用于代表状态或者类别.但是我们只希望这个参数的值输入0 到 5 这个范围的值,如果多输入大了我们的代码上并 ...

  9. java 集合遍有几种方法_Java 集合遍历的几种方法

    以下实例演示了如何遍历从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型的集合,以下我们分别使用了普通for,增强型的 for ,iterator 等方式来遍历集合: ...

最新文章

  1. 漫画 | 没有一个程序员能拒绝这样的女朋友
  2. 1个月教你学会用Python实现机器学习
  3. linux centos 7 crontab 启动,CentOS 7 Linux执行crontab 计划任务实操 - 好应网
  4. java 删 除文件操作,C语言 File文件处理 删除文件
  5. 西部动力成功中标围场县政府网站群建设项目
  6. Android基础篇1:Activity
  7. 给页面title添加图标
  8. ElasticSearch 安装与API的使用
  9. Laravel 登录验证,md5验证,自定义验证,自定义表
  10. 百度翻译用户群体及部分功能分析
  11. 云目录(DaaS )快速入门
  12. Android ActivityGroup简介
  13. 【系统之家首发】11月最新系统GHOSTXP_SP3电脑公司快速装机版V2011.11
  14. Remotely Controlling(远程控制) an Octeon through PCI, PCIe, or EJTAG
  15. 三次贝塞尔曲线画圆的方法。
  16. 蓝桥杯 星系炸弹(第六届第二题)
  17. 取到一个数的各个位的方法
  18. 【数据结构】--- 二叉树的递归遍历和非递归遍历【C语言实现】
  19. 小学信息用计算机绘画教案,小学信息技术《初识画图》教学设计
  20. 一进系统就黑屏的故障原因分析

热门文章

  1. wingdows安装psutil_python 第一步
  2. pythonrequest得替代_Python爬虫通过替换http request header来欺骗浏览器实现登录功能...
  3. 泰亚史诗萨拉斯服务器维护,泰亚史诗上古馈赠介绍 这个可是好东西
  4. linux串口中断_5年匠心之作,深度探索Linux虚拟化
  5. 电视看板实现原理_电脑显示器如何改装成电视机?详细改装方法,修电脑师傅告诉你...
  6. 2018.6.1信息安全铁人三项赛数据赛writeup
  7. [Java]Thinking in Java 练习2.12
  8. Android调试秘钥证书指纹获取方式
  9. 【HTML 初学】1、HTML元素
  10. MFC SDI 中 通过注册表保存当前窗体的 显示状态位置