来源:http://www.bjsxt.com/
1、S02E133_01容器的同步控制与只读设置
(1)同步控制:多线程并发访问集合的线程安全(多人咬苹果不咬到其他人的手)
——常用ArrayList、HashSet、HashMap等都是线程不安全的
——Collections提供了synchronizedXxx()方法,将指定容器包装成同步
——1——synchronizedList()
——2——synchronizedSet()
——3——synchronizedMap()
package com.test.collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestSyn {
public static void main(String[] args) {
//list不可同步
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
//synList可以同步
List<String> synList = Collections.synchronizedList(list);
System.out.println("线程安全的" + synList + "制作完毕");
}
}
(2)不可变设置:“只读”访问,Collections提供了三种方法
a.——emptyXxx():空的不可变的集合
——1——static <T> List<T>
emptyList()
返回空的列表(不可变的)。
——2——static <K,V> Map<K,V>
emptyMap()
返回空的映射(不可变的)。
——3——static <T> Set<T>
emptySet()
返回空的 set(不可变的)。
b.——singletonXxx():一个元素不可变的集合
——1——static <T> Set<T>
singleton(T o)
返回一个只包含指定对象的不可变 set。
——2——static <T> List<T>
singletonList(T o)
返回一个只包含指定对象的不可变列表。
——3——static <K,V> Map<K,V>
singletonMap(K key, V value)
返回一个不可变的映射,它只将指定键映射到指定值。
c.——unmodifiableXxx():不可变容器
——1——static <T> Collection<T>
unmodifiableCollection(Collection<? extends T> c)
返回指定 collection 的不可修改视图。
——2——static <T> List<T>
unmodifiableList(List<? extends T> list)
返回指定列表的不可修改视图。
——3——static <K,V> Map<K,V>
unmodifiableMap(Map<? extends K,? extends V> m)
返回指定映射的不可修改视图。
——4——static <T> Set<T>
unmodifiableSet(Set<? extends T> s)
返回指定 set 的不可修改视图。
——5——static <K,V> SortedMap<K,V>
unmodifiableSortedMap(SortedMap<K,? extends V> m)
返回指定有序映射的不可修改视图。
——6——static <T> SortedSet<T>
unmodifiableSortedSet(SortedSet<T> s)
返回指定有序 set 的不可修改视图。
package com.test.collections;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class TestReadOnly {
public static void main(String[] args) {
testMap();
testList();
System.out.println(testSet(null));//打印:[]
}
public static void testMap(){
Map<String, String> map =new HashMap<String, String>();
map.put("a1", "a1");
map.put("a2", "a2");
//只读控制
Map<String, String> map2 = Collections.unmodifiableMap(map);
//map2.put("a3", "a3");//此句产生异常java.lang.UnsupportedOperationException
System.out.println(map2.size());
}
public static void testList(){
//一个元素的容器测试
List<String> list = Collections.singletonList(new String("b1"));
//list.add("b2");//只能包含一个元素的容器,此句产生异常UnsupportedOperationException
System.out.println(list);
}
public static Set<String> testSet(Set<String> set){
if(null == set){
return Collections.emptySet();//外部获取避免NullPointerException
}
set.isEmpty();//没有上面if的处理,会产生异常NullPointerException
return set;
}
}