天天看點

java容器(集合)的控制與隻讀設定

一、同步控制:多線程并發通路集合的線程安全

1.常用容器ArrayList HashSet HashMap等都是線程不安全的

2.Collections提供了synchronized()方法,将指定容器包裝同步

synchronizedList()

synchronizedSet()

synchronizedMap()

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 使用collections管理同步容器
 */
public class Test01 {

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		// list可以同步
		List<String> synList = Collections.synchronizedList(list);
		System.out.println("線程安全的list制作完畢");
	}

}
           

二、不可變設定:“隻讀”通路,

1.Collections提供了三種方法
(1) emptyXxx()空的不可變集合
(2)singletonXxx()一個元素不可變的集合
(3)unmodifiableXxx()不可變容器
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 隻讀設定
 * 1.emptyXxx()空的不可變集合
 * emptyList() 
 * emptyMap() 
 * emptySet() 
 * 2.singletonXxx()一個元素不可變的集合
 * singleton(T o) 
 * singletonList(T o) 
 * singletonMap(K key, V value) 
 * 3.unmodifiableXxx()不可變容器
 * unmodifiableList(List<? extends T> list) 
 * unmodifiableSet(Set<? extends T> s) 
 * unmodifiableMap(Map<? extends K,? extends V> m) 
 *
 */
public class Test02 {

	public static void main(String[] args) {
		Map<String, String> map=new HashMap<>();
		map.put("test", "testXXXXX");
		map.put("嘻嘻", "嘻嘻嘻嘻");
		
		//隻讀控制
		Map<String, String>map2=Collections.unmodifiableMap(map);
		//map2.put("a", "a");//不能操作,會報異常 java.lang.UnsupportedOperationException
		System.out.println(map2.size());
		
		//一個元素的容器測試
		List<String> list= Collections.singletonList(new String());
		list.add("test");
		//list.add("哈哈哈哈");//隻能包含一個元素的容器,會報錯
		
	}
	
	public static Set<String> oper(Set<String>set){
		if(null==set){
			return Collections.EMPTY_SET;//外部擷取避免NullPointerException
		}
		return set;
	}

}
           
2.ImmutableList
使用ImmutableList,需要使用guava集合庫;
Guava:google的工程師利用傳說中的“20%時間”開發的集合庫,它是對jdk提供的擴充,提供了很多實用的類來簡化代碼。
開源位址:https://github.com/google/guava

jar包下載下傳:http://maven.outofmemory.cn/com.google.guava/guava/

guava對隻讀設定安全可靠,并且相對簡單。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.google.common.collect.ImmutableList;

/**
 * 隻讀設定
 */
public class Test01 {

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		//對原有的list進行包裝,相等于原有list的一個視圖,快照,不夠安全
		List<String> readList=Collections.unmodifiableList(list);
		//readList.add("d");//java.lang.UnsupportedOperationException
		list.add("d");//改變原有list 視圖也一起改變
		
		//對比檢視 初始化list guava對隻讀設定安全可靠,并且相對簡單
		List<String> immutableList=ImmutableList.of("a", "b", "c");
		immutableList.add("d");//java.lang.UnsupportedOperationException
	}

}