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; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public 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; } @Override public String toString() { return "User [age=" + age + ", name=" + name + "]"; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }