Java:数组和集合类作为参数传递时的差别

发表于:2012-11-15 09:26

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zzp_403184692    来源:51Testing软件测试网采编

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

  首先定义一个类Test1:

public class Test1 {
 
 //这部分是针对list的操作,首先定义一个空的list集合容器
 List<String> list=null;
 //用list集合容器作为参数的构造方法
 public Test1(List<String> 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<String> list=null;
 static String[] str=null;
 //返回一个list集合类型的数据
 public static List<String> getList()
 {
  List<String> test=new ArrayList<String>();
  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<String> iterator = list.iterator(); iterator.hasNext();)
       {
        System.out.println("List集合结果为:"+iterator.next().toString());
       }
       //将getString()方法中得到的数组传递给str,并显示其中的内容
    str=getString();
    for(int i=0;i<str.length;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是没有变化的,哎,写到这里,有想到了自己可怜的基础知识了,还是需要慢慢积累吧,加油!

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号