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);

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class Test {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
//返回同步的容器
Map<String,String> synMap = Collections.synchronizedMap(map); List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
//返回同步的容器
List<String> synList = Collections.synchronizedList(list); Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
//返回同步的容器
Set<String> synSet = Collections.synchronizedSet(set);
}
}

返回的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)

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class Test{
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
//返回只读的容器
Map<String,String> unmoMap = Collections.unmodifiableMap(map);
//unmMap为只读,这时往里面放入元素会出现错误。
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
//返回同步的容器
List<String> unmoList = Collections.unmodifiableList(list);
//unmoList为只读,这时往里面放入元素会出现错误。
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
//返回同步的容器
Set<String> synSet = Collections.unmodifiableSet(set);
//unmoSet为只读,这时往里面放入元素会出现错误。
}
}

3.单元素不可变容器

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

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

4.不可变空集合

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

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class Test{
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map = null;
if(reMap(map) == Collections.EMPTY_MAP)
System.out.println("true"); }
public static Map<String, String> reMap(Map<String, String> map){
if(map == null)
return Collections.emptyMap();
return map;
}
}
运行结果:
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. php CI框架基础知识

    一. CI框架的MVC导图 二. CI框架目录文件介绍 (1)index.php  单入口         整个框架对外暴露的唯一访问文件 (2)application  应用文件(放置用户信息,用户 ...

  2. JS遮罩层弹框效果

    对于前端开发者来说,js是不可缺少的语言.现在我开始把我日常积累的一些js效果或者通过搜索自己总结的一些效果分享给大家,希望能够帮助大家一起进步,也希望大家能够多多支持! 1.今天我先分享一个遮罩层弹 ...

  3. 【Foreign】Research Rover [DP]

    Research Rover Time Limit: 25 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample ...

  4. loj6087 毒瘤题

    传送门:https://loj.ac/problem/6087 [题解] 这垃圾题目卡空间啊... k=1相信大家都会,把所有数异或起来就是答案了. 考虑k=2,把所有数异或起来得到两个答案数的异或值 ...

  5. [BZOJ3698]XWW的难题解题报告|上下界网络流|有源汇最大流

    XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核.XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A,满足XW ...

  6. [bzoj3132]上帝造题的七分钟——二维树状数组

    题目大意 你需要实现一种数据结构,支援以下操作. 给一个矩阵的子矩阵的所有元素同时加一个数. 计算子矩阵和. 题解 一看这个题,我就首先想到用线段树套线段树做. 使用二维线段树的错误解法 其实是第一次 ...

  7. MySQL 查询语句练习1

    1.创建成绩表,字段包括:学生姓名,语文成绩,数学成绩,英语成绩 向表中插入多条数据: 查询: (1) 查询所有学生的数学成绩和总成绩 (2) 查询所有学生的语文和数学成绩和,按从高到低排序 (3) ...

  8. mac air 装ubuntu16.04

    前言 我的mac air购于14年,128GB款.最开始我只是在OS X系统里留出了70GB给ubuntu,然后通过u盘装了ubuntu 14.04,后来又陆续将系统升级到15.04.16.04.各方 ...

  9. phpstorm调试环境XDebug搭建

    1.安装XDebug,通过phpinfo()可以看到xdebug是否已安装!!!如果未安装,可以先看我的另一篇关于XDebug安装的文章:http://www.cnblogs.com/cxscode/ ...

  10. 同源、同源策略、跨域问题、django解决方案

    什么是同源: URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源. 注意:假如你的网站ip是123.123.123.123,网站的域名是www.abc.com. ...