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

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

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.  
  9. public class Test{
  10. public static void main(String[] args) {
  11. //返回了只能放一个元素的集合
  12. Map<String,String> singMap = Collections.singletonMap("1","1");//创建时已放入第一个元素
  13. //如果再往singMap中添加元素会出错。
  14.  
  15. //返回了只能有一个元素的集合
  16. List<String> singList = Collections.singletonList("1");
  17. //如果再往singList中添加元素会出错。
  18. }
  19. }

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.  
  9. public class Test{
  10. public static void main(String[] args) {
  11. Map<String,String> map = new HashMap<>();
  12. map = null;
  13. if(reMap(map) == Collections.EMPTY_MAP)
  14. System.out.println("true");
  15.  
  16. }
  17. public static Map<String, String> reMap(Map<String, String> map){
  18. if(map == null)
  19. return Collections.emptyMap();
  20. return map;
  21. }
  22. }
  1. 运行结果:
  2. true

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

5.10(java学习笔记)容器的同步控制与只读设置的更多相关文章

  1. Java学习笔记----容器

    一.Java Collections框架是什么? Java Collections 框架中包括了大量集合接口以及这些接口的实现类和操作它们的算法(如:排序.查找.反转.替换.复制.取最小元素.取最大元 ...

  2. Java学习笔记——MySQL开放3306接口与设置用户权限

    系统Ubuntu16.04 LTS 1.开放3306端口查看端口状态:netstat -an|grep 3306tcp        0      0 127.0.0.1:3306          ...

  3. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  4. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  5. Java学习笔记--Swing用户界面组件

    很多与AWT类似. 事件处理参考:Java学习笔记--AWT事件处理 1.设计模式: 模型:存储内容视图:显示内容控制器:处理用户输入· 2. 文本输入常用组件 2.1 文本域: JLabel lab ...

  6. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  7. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  8. java学习笔记11--集合总结

    java学习笔记系列: java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Ob ...

  9. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

随机推荐

  1. 通过js修改微信内置浏览器title

    document.setTitle = function(t) { document.title = t; var i = document.createElement('iframe'); i.sr ...

  2. 【poj3693-重复次数最多的连续重复子串】后缀数组

    题意:给定一个串,长度<=10^5,求它重复次数最多的连续重复子串(输出字典序最小的那个). 例如ccabcabc,答案就是abcabc 一开始没想清楚,结果调了好久. 原理: 按照L划分,因为 ...

  3. 百练2505:A multiplication game

    传送门:http://bailian.openjudge.cn/practice/2505/ [题解] 我们找找规律: 1~9显然是Stan wins. 10~18是Ollie wins. 19~16 ...

  4. 【CF103D】Time to Raid Cowavans(分块)

    题意: 思路:院赛防AK题,然而还没来得及做就被数据出锅的题坑了…… #include<cstdio> #include<cstring> #include<string ...

  5. 【BZOJ】2442: [Usaco2011 Open]修剪草坪

    [算法]动态规划 [题解] 万物皆动规,每时每刻都要想着DP!特别是这种明显可以序列递推的题目. 一个简单的思路是f[i]表示前i个选择合法方案(第i个可选可不选)的最大效率 f[i]=max(f[i ...

  6. hdu 2141 Can you find it?(二分查找)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2141 题目大意:查找是否又满足条件的x值. 这里简单介绍一个小算法,二分查找. /* x^2+6*x- ...

  7. 列出top中的pid

    #!/usr/bin/env python import os import string #方法1:通过字符串的isdigits来判断 #filelist = os.listdir('/proc') ...

  8. 连接Linux服务器:Win免费SSH客户端工具

    连接Linux服务器:Win免费SSH客户端工具 http://blog.csdn.net/jiangdou88/article/details/51585555

  9. vue + webpack + gulp 简单环境 搭建

    一.物料准备 废话不多说,直接上 package.json { "name": "vwp", "version": "1.0.0& ...

  10. js反混淆工具

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...