Collection中的视图技术

       Java集合框架设计巧妙!刚开始接触时,老是被他们复杂的关系困惑!特别是Map!今天看到这样一篇文章,讲述了

 

Collection和Map的视图技术,令我豁然开朗!

 

        比如:Map.keySet(),Map.values(),Map.entrySet().可以得到三个视图:键值,值,键/值对。对视图的操作,

 

将直接影响原始集合!

 

一: 轻量级集合包装器:

 

String[] temp=new String[20];

 

List<String> tempList=Arrays.asList(temp);

 

以上代码返回的不是一个ArrayList,而是一个视图对象,你只能使用get(),set()方法访问底层的数组,而任何尝试

 

改变数组大小的方法都抛出UnsupportedOperationException。用Junit测试Collections.nCopies(int n, T o)

 

       public void testCollectionnCopies(){


        List<String> settings=Collections.nCopies(5, "Baby");
       
        String testStr1=settings.get(1);


        String testStr0=settings.get(0);
       
        System.out.println(testStr1==testStr0);//返回true
       
        System.out.println(testStr1);


        settings.add("B");//抛出UnsupportedOperationException


        System.out.println(settings);
    }

 

同时:还有Collections.singleton(anObject)等实用的方法。

 

    二:子范围

 

    你可以为许多集合建立子范围视图!任何操作作用于子范围,他们都能通过在这个集合中反映出来!

 

如:subList(),subSet(),headSet(),tailSet(),subMap().headMap(),tailMap()

 

        public void testsubView(){


        List<String> tempList=new ArrayList<String>();


        for(int i=0;i<10;i++){


            tempList.add(""+i);


        }
       
        List subList=tempList.subList(3, 7);


        System.out.println(subList);//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
       
        subList.clear();


        System.out.println(tempList);[0, 1, 2, 7, 8, 9]
    }

 

注:Map返回由键值定范围内的所有数据项。

 

     三:不可修改视图

 

    如果你想查看代码的某个部分但不修改某个集合的内容可以考虑以下方法:

 

    Collections.unmodifiableCollection()

 

    Collections.unmodifiableList()

 

    Collections.unmodifiableMap()

 

    Collections.unmodifiableSet()

 

    Collections.unmodifiableSortedSet()

 

    Collections.unmodifiableSortedMap()

 

   code:

   public void testUnmodifiable(){
        List<String> tempList=new LinkedList();
        for(int i=0;i<10;i++){
            tempList.add(""+i);
        }
       
        List<String> unmodifiableList=Collections.unmodifiableList(tempList);
        String temp=unmodifiableList.get(1);
        System.out.println(tempList);
       
        tempList.add("baby");
        System.out.println(tempList);
       
        unmodifiableList.add("bb");
        System.out.println(tempList);
    }

注意:不可修改视图不是本省不可修改,通过集合的原始引用,我们仍然能够做集合想做的事情。视图只包装了接口而不是实际的对象。

 

四:同步视图

 

多线程来访问一个集合!我们能够想象会发生什么。一个线程试图将一个元素添加到散列表中,而另一个线程或者正在遍

 

历,或者对元素重新散列!或者。。。。。。

 

Java的设计者没有实现“安全集合类”,而是使用视图机制来保证集合线程的安全!

 

HashMap<String,String> hashMap=new HashMap<String,String>();
Map<String,String> map=Collections.synchronizedMap(hashMap);

 

map引用将会使得一切恢复正常!不必担心同步的问题!但是这个包装器的作用有限:推荐使用:java.util.concurrent

 

中定义的集合类!

 

五:被检验视图

 

它是关于泛型的操作!

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值