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
中定义的集合类!
五:被检验视图
它是关于泛型的操作!