Collections.unmodifiableMap

对于不可变的Collections.unmodifiableMap 是否真的不可以变?

博客:http://blog.csdn.net/l2tp1012/article/details/39338209


 Java Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.example.demo;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public  class SeeminglyUnmodifiable
{
     private Map< String, Point> startingLocations =  new HashMap< String, Point>( 3);

     public SeeminglyUnmodifiable()
    {
        startingLocations.put( "LeftRook"new Point( 11));
        startingLocations.put( "LeftKnight"new Point( 12));
        startingLocations.put( "LeftCamel"new Point( 13));
         //..more locations..
    }

     public Map< String, Point> getStartingLocations()
    {
         return Collections.unmodifiableMap(startingLocations);
    }

     public  static  void main( String [] args)
    {
        SeeminglyUnmodifiable  pieceLocations =  new SeeminglyUnmodifiable();
        Map< String, Point> locations = pieceLocations.getStartingLocations();

        Point camelLoc = locations.get( "LeftCamel");
        System.out.println( "The LeftCamel's start is at [ " + camelLoc.getX() +   ", " + camelLoc.getY() +  " ]");

         //Try 1. update elicits Exception
         try
        {
            locations.put( "LeftCamel"new Point( 00));
        }
         catch (java.lang.UnsupportedOperationException e)
        {
            System.out.println( "Try 1 - Could not update the map!");
        }

         //Try 2. Now let's try changing the contents of the object from the unmodifiable map!
        camelLoc.setLocation( 00);

         //Now see whether we were able to update the actual map
        Point newCamelLoc = pieceLocations.getStartingLocations().get( "LeftCamel");
        System.out.println( "Try 2 - Map updated! The LeftCamel's start is now at [ " + newCamelLoc.getX() +   ", " + newCamelLoc.getY() +  " ]");
    }
}

class Point
{
     public  float x;
     public  float y;
     public Point( float x,  float y)
    {
        setLocation(x, y);
    }
     public  void setLocation( float x,  float y)
    {
         this.x = x;
         this.y = y;
    }

     public  float getX()
    {
         return x;
    }

     public  float getY()
    {
         return y;
    }
}

从这个代码可以看出:Collections.unmodifiableMap不是真正的不可以改变,其原理可以从Collections.unmodifiableMap的源代码看出来:

源代码如下:


 Java Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public V put(K key, V value)
{
     throw  new UnsupportedOperationException();
}
public V remove(Object key)
{
     throw  new UnsupportedOperationException();
}
public  void putAll(Map<?  extends K, ?  extends V> m)
{
     throw  new UnsupportedOperationException();
}
public  void clear()
{
     throw  new UnsupportedOperationException();
}

结论:Collections.unmodifiableMap是可以对map的值进行修改的,不可以采用put方式进行, 正确的姿势是对Value 采用Set方法进行修改

但是真实的使用场景Collections.unmodifiableMap是不需要对值进行修改的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值