对Map(HashMap)、List以get方法获得的值进行操作是否改变原值测试

编程入门 行业动态 更新时间:2024-10-12 22:25:22

对Map(HashMap)、List以get方法获得的值进行操作是否改变<a href=https://www.elefans.com/category/jswz/34/1741496.html style=原值测试"/>

对Map(HashMap)、List以get方法获得的值进行操作是否改变原值测试

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 = A.get();对B的操作会改变A的值,如果再下一层中间变量Integer C=B.get(),则对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<>(Arrays.asList("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("positions.add(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+",positionsMap.get(\"a\")原值="+positionsMap.get("a"));Integer papa=pa.get((int)(pa.size()-1));papa+=10;System.out.println("papa=pa.get方法:papa+=10是否改变pa:papa="+papa+",pa="+pa+",positionsMap.get(\"a\")="+positionsMap.get("a"));//改变原值pa.set((int)(pa.size()-1),papa*2);System.out.println("pa.get,set(papa*2)方法:"+pa+",positionsMap.get(\"a\")="+positionsMap.get("a"));//改变原值pa.stream().map(n->n).forEach(n->n+=100);//不改变原值System.out.println("pa.stream迭代器方法:pa="+pa+",positionsMap.get(\"a\")="+positionsMap.get("a"));//不改变原值pa.add(1000);System.out.println("pa.add(1000)方法:pa="+pa+",positionsMap.get(\"a\")"+positionsMap.get("a"));}
}

输出为:

新一轮循环,str=a,i=0,positionsMap={},positions=null

a初次统计,str=a,i=0,positionsMap={a=[]}
positions.add(i)后,i=0,positionsMap={a=[0]}
新一轮循环,str=b,i=1,positionsMap={a=[0]},positions=null

b初次统计,str=b,i=1,positionsMap={a=[0], b=[]}
positions.add(i)后,i=1,positionsMap={a=[0], b=[1]}
新一轮循环,str=b,i=2,positionsMap={a=[0], b=[1]},positions=[1]
positions.add(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=[]}
positions.add(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]
positions.add(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]
positions.add(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=[]}
positions.add(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]
positions.add(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]
positions.add(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=[]}
positions.add(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]
positions.add(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=[]}
positions.add(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],positionsMap.get(“a”)原值=[0]
papa=pa.get方法:papa+=10是否改变pa:papa=10,pa=[0],positionsMap.get(“a”)=[0]
pa.get,set(papa*2)方法:[20],positionsMap.get(“a”)=[20]
pa.stream迭代器方法:pa=[20],positionsMap.get(“a”)=[20]
pa.add(1000)方法:pa=[20, 1000],positionsMap.get(“a”)[20, 1000]

Process finished with exit code 0

如此,便可以明白结论为何这么说了。
不明白的,可以参考List在遍历时修改元素会怎样?——学习笔记这篇博客,对list进行说明。

更多推荐

对Map(HashMap)、List以get方法获得的值进行操作是否改变原值测试

本文发布于:2024-03-23 18:39:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1741490.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:原值   操作   测试   方法   Map

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!