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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值