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

上一篇 / 下一篇  2012-11-16 11:56:06 / 个人分类:Java

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

"b._"u9s1S-Le'N051Testing软件测试网qQa;]0rX.[i

  首先定义一个类Test1:

)L@ms R7EXd0
public class Test1 {51Testing软件测试网%{sfN*u'DfD
 
hYN/S8aK Gn4T)n b0 //这部分是针对list的操作,首先定义一个空的list集合容器
H Q&C/Z t0 List<String> list=null;51Testing软件测试网R&v(Csax6P _:w
 //用list集合容器作为参数的构造方法51Testing软件测试网{5c-pj)q,]5C6Hp3ya
 public Test1(List<String> list)
7ycumzd'u4eWW0 {
D^9Sc$AZ0  super();51Testing软件测试网?U(f%WIy
  this.list=list;
#H9\-?|6?"L0 }
8SfLC1\ng.r2L0 //对容器增加数据
B5^~ ev_0 public void putList(){
(G2n*E$XhC;t(I^ph0 
2ki"gSYV2| [0  list.add("list1");51Testing软件测试网I'a [z#DL#xQ6_
  list.add("list2");51Testing软件测试网NP R)T#]T
         list.add("list3");51Testing软件测试网RFD)n:y|n1h0F(Z
 }
]&V%K4Z0ej2v0 
I s eL3a\0 //------------------------------------------------------------------51Testing软件测试网E4fS'z%p%qk
 
?Mmk-x/R0 //这部分是对数组的操作,首先定义一个空的数组
vp A@Q7rbX0 String[] str=null;
B(L.R9S7hW9g"gsZ0 //用数组作为参数的构造方法
ef g,J-q&Te!J#Xz0 public Test1(String[] str)
MpY3Gv0 {
]8F"Y_ih6c.U$z0  this.str=str;
U%A:~C%h%EQi0 }
(d:Qi"b2q2@&n7c0 //对数组增加数据
2L5H2i8xh'n$V/Nm0 public void putString()51Testing软件测试网2q T~9j9s#V$E,_
 {51Testing软件测试网Rt3SCbM w B
  str=new String[]{"string1"};51Testing软件测试网 t7`L kA\rMA*JA
 }
A*Lt@Rg#m5\0}
51Testing软件测试网}"BXq*HL)q@

  该类中分别定义了对List集合和数组Str的处理。对于List集合,首先定义一个List集合作为参数的集合,然后再通过方法putList()对集合进行数据增加,对于数据也做了类似的操作,然后定义一个操作类Test2:51Testing软件测试网4FOj"w%k#aT c

51Testing软件测试网 @q4R OdYh

public class Test2 {51Testing软件测试网8M+F4{4{$fof

51Testing软件测试网M\'u(g$I,YQJ(h

 //定义空的list集合以及数组
k-}a h/kHj hr$] k4w"g0 static List<String> list=null;51Testing软件测试网N[kz{&i C_%?
 static String[] str=null;51Testing软件测试网:y~p.r^
 //返回一个list集合类型的数据
\6Om~ Y:^ { ~!R|0 public static List<String> getList()
Y4k%D*p*l2LF!g0 {
"a:h%~ D'x|c/h}0  List<String>test=new ArrayList<String>();51Testing软件测试网3J:|4i-w8D
  Test1 test1=new Test1(test);51Testing软件测试网 Gl [f)pr8S
  test1.putList();51Testing软件测试网4I` @w7tW5c6vO%x
  return test;51Testing软件测试网P P1idHl9s0DL0?
 }
/cp#TXPv0r0 //返回一个数组类型的数据51Testing软件测试网vSZk Kd%U6wMwx
 public static String[] getString()
|${#m!~\'|1nf;|0 {51Testing软件测试网/L5n:B/M-nz$a
  String[] test=new String[]{"string2"};
NylB1F;{K-O0  Test1 test1=new Test1(test);
.B!it2d(OF,jb*d(m0  test1.putString();51Testing软件测试网6Xe w%P#`-T,x"j
  return test;
)Q h,`"Q,| n-|0 }
51Testing软件测试网:l]}#W6jML2w

51Testing软件测试网K&j"\9E?{ B8YV

   public static void main(String[] args)51Testing软件测试网ZmA h/B^
   {51Testing软件测试网h\5w3Kv
    //将getList()方法中得到的list集合传递给list,并显示其中的内容
+b'QO0I,`1Pa0    list=getList();
n9n-TK-j@1NYT0       for (Iterator<String> iterator = list.iterator(); iterator.hasNext();)51Testing软件测试网 _j7lJ-} X j!Nr
       {
U(pa5Ek0        System.out.println("List集合结果为:"+iterator.next().toString());51Testing软件测试网3_ R0]pS
       }51Testing软件测试网2N/S&SU Y
       //将getString()方法中得到的数组传递给str,并显示其中的内容51Testing软件测试网6N)f^ FX[y,?&]
    str=getString();
$yc)dUqYY%Z6~m{0    for(int i=0;i<str.length;i++)
%F}8_Z'L/O9dS(e0    {
#C4BuE2EC#c:f+hk0     System.out.println("数组结果为:"+str[i]);51Testing软件测试网7|3z uN;P0?Y
    }51Testing软件测试网`|8|VM
   }
2I%?3Coo-|0}
51Testing软件测试网x'|U2fVJ t7k

51Testing软件测试网u&\:C;W0P?Xbf

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

3i@BikA(itAdy0
List集合结果为:list1
3gDXB8g6f2\4l(X0List集合结果为:list251Testing软件测试网 w%|~+~ P(AX2xek
List集合结果为:list3
b8m!o1L;F:b0数组结果为:string2

`Ng1{ sU0  问题: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,这不就成了值传递了吗,没有对数组进行改变?

5st.v BO0LjZ5Bz0

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


TAG:

 

评分:0

我来说两句

Open Toolbar