HashMap和HashTable
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable的方法大部分都加了synchronized,而HashMap就没有加。
4.HashTable使用Enumeration,HashMap使用Iterator。
其他很多细节就不多说了,源码里面和文档都写得很清楚。
就类似StringBuffer和Stringbuilder,一个线程安全效率略低,一个线程不安全效率略高。
给你一段ArrayList的线程安全问题代码--来之张孝祥多线程视频-19_传智播客_张孝祥_java5同步集合类的应用- public class CollectionModifyExceptionTest {
- public static void main(String[] args) {
- Collection<User> users = new ArrayList<User>();
- users.add(new User("张三", 28));
- users.add(new User("李四", 35));
- users.add(new User("王五", 41));
- Iterator<User> itUser = users.iterator();
- while(itUser.hasNext()){
- User user = (User)itUser.next();
- //String name = "张三";
- //String name = "李四";
- String name = "王五";
- if(name.equals(user.getName())){
- users.remove(user);
- //itUser.remove();
- }else{
- System.out.println(user);
- }
- }
- }
-
- static class User {
- private String name = null;
- private int age = 0;
- public User(String name,int age) {
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- @Override
- public String toString() {
- return "User [name=" + name + ", age=" + age + "]";
- }
- }
- }
复制代码 |