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

时间:2025-02-09 09:01:19

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进行说明。