线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

来源:互联网 发布:淘宝上的装修公司 编辑:程序博客网 时间:2024/04/29 12:16

1. HashSet与HashMap的联系与区别?

   区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键;

   联系:HashSet的底层就是HashMap,可以参考HashSet的类源码,默认构造方法为:

   public HashSet(){

      map = new HashMap<key,Object>

   }

  就是HashSet只用HashMap的键,而不用他的值,前者的值可以程序员随便指定,反正不用

2. 线程并发库中的集合优路劣之分

 HashMap和HashSet如果在成千上万个线程并发的时候会使cup占满;这时java5线程并发库中开发了新技术并发库集合;可以使用其中的ConcurrentMap,也可以在HashMap的使用时加上同步锁synchronized;其实ConcurrentMap类的编写中就是在重写原来HashMap中的所有方法,只是返回值是原来的方法加上了一个同步锁

3.同步集合

 4.下面举一个线程并发库集合中的类的案例应用,这个案例比较贴近改知识点的说明package com.java5.thread.newSkill;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.concurrent.CopyOnWriteArrayList;public class CollectionModifyExceptionTest {/** * @param args */public static void main(String[] args) {//CopyOnWriteArrayList为线程并发库集合中的类,可以避免HashMap中的并发异常/* * 直接使用传统的ArrayList会出现各式各样的线程并发异常异常,有兴趣的可以试试 */Collection<User> users = new CopyOnWriteArrayList<User>();//Collection<User> users = new ArrayList<User>();users.add(new User("杨凯", 21));users.add(new User("杨旋", 20));users.add(new User("潇洒", 22));Iterator itrUsers = users.iterator();while (itrUsers.hasNext()) {User user = (User) itrUsers.next();if ("潇洒".equals(user.getName())) {users.remove(user);} else {System.out.println(user);}}}}辅助类:User类package com.java5.thread.newSkill;public class User {private String name;private int age;User(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic String toString() {return "User [age=" + age + ", name=" + name + "]";}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}


 

 

原创粉丝点击