1、问题
在编程时遇到一个问题:
step1:首先对Map(HashMap)、List的变量A赋值,
step2:然后声明中间变量B以get()方法获得A的一个或几个值,
step3:对B进行操作,
发现仅对B的操作(增删查改),有的操作改变了A的值,有的没有改变A的值。
三种类型放到一起有点杂乱,先看结论吧。
2、结论
迭代器方法操作中间变量或原变量都不会改变原来变量的值;
非迭代器方法会改变原来变量的值。
详细理解为:
1、add(),remove(),set()方法操作中间变量会改变原变量的值,
2、iterator,stream().map()迭代器方法操作中间变量不会改变原变量的值,
3、需要注意,如果中间变量是int,string等基本数据类型,对这些基本数据类型的操作也不会改变原来变量的值。
如:原变量A为:Map<String, List> A,中间变量为 List B = ();对B的操作会改变A的值,如果再下一层中间变量Integer C=(),则对C的操作不会改变B和A。
3、 探讨
例子为统计字符数组List<String> list =("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g")
中"a", "b", "c", "d", "f", "g"
出现的下标,并分别将"a" 、“b”、 “c”、 “d”、 “f”、 "g"作为key(String类型
),下标作为value(List<Integer>类型
)存入map对象,比如:
key=a,value=[0],;
key=b,value=[1, 2];
key=c,value=[3, 4, 5];
key=d,value=[6, 7, 8];
key= f,value=[9, 10];
key= g,value=[11]
首先看代码:
package test;
import java.util.*;
public class ComputeTest {
//List<String> list =new ArrayList<>(("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g"));
public static Map<String, List<Integer>> getElementPositions(List<String> list) {
Map<String, List<Integer>> positionsMap = new HashMap<String, List<Integer>>();
for (int i = 0; i < list.size(); i++)
{
String str = list.get(i); // 获得下标为i时的list[i]
List<Integer> positions = positionsMap.get(str); //获得key值为str时的value,i=0时value为空
System.out.println("新一轮循环,str="+str+",i="+i+",positionsMap="+positionsMap+",positions="+positions); //输出下标为i时的str(即list[i])、positions(即key值为list[i]时的value)
if (positions == null) // i=0时,str初次统计,将str作为key存入positionMap
{
positions = new ArrayList<>(1);
positionsMap.put(str, positions);// 本程序中,str初次统计时positions 为空
System.out.println("\n"+str+"初次统计,str="+str+",i="+i+",positionsMap="+positionsMap);
}
positions.add(i);// 这一步并没有操作positionsMap,但是positionsMap的value值改变了
System.out.println("(i)后,i="+i+",positionsMap="+positionsMap);
}
return positionsMap;
}
public static void main(String[] args) throws Exception {
List<String> list = Arrays.asList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g");
Map<String, List<Integer>> positionsMap = getElementPositions(list);
System.out.println("\n输出: "+positionsMap);
System.out.println("\n——————对Map(HashMap)以get方法获得的值进行操作是否改变原值测试:——————");
List<Integer> pa = positionsMap.get("a");
System.out.println("\npa原值="+pa+",(\"a\")原值="+positionsMap.get("a"));
Integer papa=pa.get((int)(pa.size()-1));
papa+=10;
System.out.println("papa=方法:papa+=10是否改变pa:papa="+papa+",pa="+pa+",(\"a\")="+positionsMap.get("a"));//改变原值
pa.set((int)(pa.size()-1),papa*2);
System.out.println(",set(papa*2)方法:"+pa+",(\"a\")="+positionsMap.get("a"));//改变原值
pa.stream().map(n->n).forEach(n->n+=100);//不改变原值
System.out.println("迭代器方法:pa="+pa+",(\"a\")="+positionsMap.get("a"));//不改变原值
pa.add(1000);
System.out.println("(1000)方法:pa="+pa+",(\"a\")"+positionsMap.get("a"));
}
}
输出为:
新一轮循环,str=a,i=0,positionsMap={},positions=null
a初次统计,str=a,i=0,positionsMap={a=[]}
(i)后,i=0,positionsMap={a=[0]}
新一轮循环,str=b,i=1,positionsMap={a=[0]},positions=null
b初次统计,str=b,i=1,positionsMap={a=[0], b=[]}
(i)后,i=1,positionsMap={a=[0], b=[1]}
新一轮循环,str=b,i=2,positionsMap={a=[0], b=[1]},positions=[1]
(i)后,i=2,positionsMap={a=[0], b=[1, 2]}
新一轮循环,str=c,i=3,positionsMap={a=[0], b=[1, 2]},positions=null
c初次统计,str=c,i=3,positionsMap={a=[0], b=[1, 2], c=[]}
(i)后,i=3,positionsMap={a=[0], b=[1, 2], c=[3]}
新一轮循环,str=c,i=4,positionsMap={a=[0], b=[1, 2], c=[3]},positions=[3]
(i)后,i=4,positionsMap={a=[0], b=[1, 2], c=[3, 4]}
新一轮循环,str=c,i=5,positionsMap={a=[0], b=[1, 2], c=[3, 4]},positions=[3, 4]
(i)后,i=5,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5]}
新一轮循环,str=d,i=6,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5]},positions=null
d初次统计,str=d,i=6,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[]}
(i)后,i=6,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6]}
新一轮循环,str=d,i=7,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6]},positions=[6]
(i)后,i=7,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7]}
新一轮循环,str=d,i=8,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7]},positions=[6, 7]
(i)后,i=8,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8]}
新一轮循环,str=f,i=9,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8]},positions=null
f初次统计,str=f,i=9,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[]}
(i)后,i=9,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9]}
新一轮循环,str=f,i=10,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9]},positions=[9]
(i)后,i=10,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10]}
新一轮循环,str=g,i=11,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10]},positions=null
g初次统计,str=g,i=11,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10], g=[]}
(i)后,i=11,positionsMap={a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10], g=[11]}
输出: {a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10], g=[11]}
——————对Map(HashMap)以get方法获得的值进行操作是否改变原值测试:——————
pa原值=[0],(“a”)原值=[0]
papa=方法:papa+=10是否改变pa:papa=10,pa=[0],(“a”)=[0]
,set(papa*2)方法:[20],(“a”)=[20]
迭代器方法:pa=[20],(“a”)=[20]
(1000)方法:pa=[20, 1000],(“a”)[20, 1000]
Process finished with exit code 0
如此,便可以明白结论为何这么说了。
不明白的,可以参考List在遍历时修改元素会怎样?——学习笔记这篇博客,对list进行说明。