经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
5.10(java学习笔记)容器的同步控制与只读设置
来源:cnblogs  作者:gcmh  时间:2018/10/23 9:28:40  对本文有异议

1、容器的同步控制

像我们平常使用的容器有些是不同步的即线程不安全,例如HashMap等,在多线程时可能出现并发问题。

而有些容器又是同步的,例如Hashtable。

有些时候我们需要将这些不同步的容器包装成同步的,就需要使用到Collections中提供的一些方法。

static <T> List<T> synchronizedList(List<T> list);

static <T> Set<T> synchronizedSet(Set<T> s);

static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);

传递进去的是线程不同步的容器,返回一个线程同步的集合。

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. public class Test {
  9. public static void main(String[] args) {
  10. Map<String,String> map = new HashMap<>();
  11. map.put("1", "1");
  12. map.put("2", "2");
  13. map.put("3", "3");
  14. //返回同步的容器
  15. Map<String,String> synMap = Collections.synchronizedMap(map);
  16. List<String> list = new ArrayList<>();
  17. list.add("1");
  18. list.add("2");
  19. list.add("3");
  20. //返回同步的容器
  21. List<String> synList = Collections.synchronizedList(list);
  22. Set<String> set = new HashSet<>();
  23. set.add("1");
  24. set.add("2");
  25. set.add("3");
  26. //返回同步的容器
  27. Set<String> synSet = Collections.synchronizedSet(set);
  28. }
  29. }

返回的syn...就是同步的容器,是线程安全的。

 

2、容器的只读控制

static <T> List<T> unmodifiableList(List<? extends T> list)
static <K,V> Map<K,V>unmodifiableMap(Map<? extends K,? extends V> m)
static <T> Set<T> unmodifiableSet(Set<? extends T> s)

返回一个只读属性的容器。

 

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. public class Test{
  9. public static void main(String[] args) {
  10. Map<String,String> map = new HashMap<>();
  11. map.put("1", "1");
  12. map.put("2", "2");
  13. map.put("3", "3");
  14. //返回只读的容器
  15. Map<String,String> unmoMap = Collections.unmodifiableMap(map);
  16. //unmMap为只读,这时往里面放入元素会出现错误。
  17. List<String> list = new ArrayList<>();
  18. list.add("1");
  19. list.add("2");
  20. list.add("3");
  21. //返回同步的容器
  22. List<String> unmoList = Collections.unmodifiableList(list);
  23. //unmoList为只读,这时往里面放入元素会出现错误。
  24. Set<String> set = new HashSet<>();
  25. set.add("1");
  26. set.add("2");
  27. set.add("3");
  28. //返回同步的容器
  29. Set<String> synSet = Collections.unmodifiableSet(set);
  30. //unmoSet为只读,这时往里面放入元素会出现错误。
  31. }
  32. }

 

3.单元素不可变容器

放置一个元素的不可变容器,创建时添加第一个元素后再次添加会报错。

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. public class Test{
  9. public static void main(String[] args) {
  10. //返回了只能放一个元素的集合
  11. Map<String,String> singMap = Collections.singletonMap("1","1");//创建时已放入第一个元素
  12. //如果再往singMap中添加元素会出错。
  13. //返回了只能有一个元素的集合
  14. List<String> singList = Collections.singletonList("1");
  15. //如果再往singList中添加元素会出错。
  16. }
  17. }

 

4.不可变空集合

static <T> List<T> emptyList()
static <K,V> Map<K,V> emptyMap()
static <T> Set<T> emptySet()

返回一个空的不可变的集合。

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. public class Test{
  9. public static void main(String[] args) {
  10. Map<String,String> map = new HashMap<>();
  11. map = null;
  12. if(reMap(map) == Collections.EMPTY_MAP)
  13. System.out.println("true");
  14. }
  15. public static Map<String, String> reMap(Map<String, String> map){
  16. if(map == null)
  17. return Collections.emptyMap();
  18. return map;
  19. }
  20. }
  1. 运行结果:
  2. true

我们在调用某些方法时,判断传递进来的集合为空,可以使用Collections.empyt...()返回一个空的不可变集合,来避免NullPointerException.

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号