关于解决数组引用类型带来的数据关联更改的问题
在今天的jsp开发中出现如下问题:
用String[] str 取出放在ArrayList<String[]>中的一组数据,对str中的个别数据项进行计算然后再用add(要存放位置的索引,数据)放入ArrayList中。由于String为引用数据类 型,当对str的数据进行更改时,会引起ArrayList中str引用的数据也进行更改,但此时我只是为了获取ArrayList数据作为一个新的对象,不希望对ArrayList的内容进行更改。如果 不做处理,str的数据和引用ArrayList中那一组的数据总是一致,有时会产生预料之外的错误,
代码示例
ArrayList<String[]> str = new ArrayList<String[]>();
String[] str1 = {"csz","csz","s"};
String[] str2 = {"dfasf","fevsd","egsegs"};
String[] str3 = {"htrjh","htdj","vdtjhng"};
String[] str4 = {"aaaaaaaa","aaaaaaaaaa","aaaaaaaaaa"};
str.add(str1);
str.add(str2);
str.add(str3);
str.add(str4);
//获取数据
String[] str5 = str.get(0);
//修改数据
str5[0]="qqqqq";
str5[1] = "qqqqqqqqqq";
str5[2] = "dsdgdfjhfjygkt6j6r6jsrjrsj6rsj6rwjsfrths";
//将修改后的数据放在ArrayList指定位置
str.add(4,str5);
//遍历输出
for(int i=0;i<5;i++){
for(String s:str.get(i))
{
System.out.print(s+" ");
}
System.out.println();
}
运行结果:
qqqqq qqqqqqqqqq dsdgdfjhfjygkt6j6r6jsrjrsj6rsj6rwjsfrths
dfasf fevsd egsegs
htrjh htdj vdtjhng
aaaaaaaa aaaaaaaaaa aaaaaaaaaa
qqqqq qqqqqqqqqq dsdgdfjhfjygkt6j6r6jsrjrsj6rsj6rwjsfrths
可见这种关联在开发中带来的不便,往往会产生开发人员不希望出现的错误,解决办法是:
先用一个数组取出其中的一组数据,然后用多个String来获取取出数组的每一个数据项,然后在把这些String变量赋值给一个新的String[]的每一项,此时再对这个数组进行计算或 更改时,将不会再使ArrayList中的数据产生变化
更改代码:
ArrayList<String[]> str = new ArrayList<String[]>();
String[] str1 = {"csz","csz","s"};
String[] str2 = {"dfasf","fevsd","egsegs"};
String[] str3 = {"htrjh","htdj","vdtjhng"};
String[] str4 = {"aaaaaaaa","aaaaaaaaaa","aaaaaaaaaa"};
str.add(str1);
str.add(str2);
str.add(str3);
str.add(str4);
//取出一组数据
String[] str6 = str.get(0);
//用String变量分别存储每一项数据
String a1 = str6[0];
String a2 = str6[1];
String a3 = str6[2];
//定义新的数组
String[] str5 = new String[3];
//把变量分别赋值给str5
str5[0] = a1;
str5[1] = a2;
str5[2] = a3;
//此时对str5的更改并不会引起原ArrayList中数据的变化
str5[0]="qqqqq";
str5[1] = "qqqqqqqqqq";
str5[2] = "dsdgdfjhfjygkt6j6r6jsrjrsj6rsj6rwjsfrths";
//把sre5加入ArrayList中
str.add(4,str5);
//遍历输出
for(int i=0;i<5;i++){
for(String s:str.get(i))
{
System.out.print(s+" ");
}
System.out.println();
}
运行结果:
csz csz s
dfasf fevsd egsegs
htrjh htdj vdtjhng
aaaaaaaa aaaaaaaaaa aaaaaaaaaa
qqqqq qqqqqqqqqq dsdgd