Map:键必须是唯一
同步方法:Map m = Collections.synchronizedMap(new TreeMap(...));
Hashtable:基于散列表的实现 允许空键空值 线程安全
HashMap:基于散列表的实现 允许空键空值 线程不安全 (与Hashtable基本一致)
TreeMap: 基于红黑树数据结构的实现 不允许空键空值 线程不安全
WeakHashMap:改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
在除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们的效率更高。
HashTable:
import java.util.Hashtable; public class Main { public static void main(String[] args) { Hashtable ht = new Hashtable(); ht.put(new A(60000) , "11"); ht.put(new A(87563) , "22"); ht.put(new A(1232) , new B()); System.out.println(ht); //只要两个对象通过equals比较返回true, //Hashtable就认为它们是相等的value。 //由于Hashtable中有一个B对象, //它与任何对象通过equals比较都相等,所以下面输出true。 System.out.println(ht.containsValue("测试字符串")); //① //只要两个A对象的count相等,它们通过equals比较返回true,且hashCode相等 //Hashtable即认为它们是相同的key,所以下面输出true。 System.out.println(ht.containsKey(new A(87563))); //② //下面语句可以删除最后一个key-value对 ht.remove(new A(1232)); //③ //通过返回Hashtable的所有key组成的Set集合, //从而遍历Hashtable每个key-value对 for (Object key : ht.keySet()) { System.out.print(key + "---->"); System.out.print(ht.get(key) + "\n"); } } } class A { int count; public A(int count) { this.count = count; } //根据count的值来判断两个对象是否相等。 public boolean equals(Object obj) { if (obj == this) return true; if (obj!=null && obj.getClass()==A.class) { A a = (A)obj; return this.count == a.count; } return false; } //根据count来计算hashCode值。 public int hashCode() { return this.count; } } class B { //重写equals()方法,B对象与任何对象通过equals()方法比较都相等 public boolean equals(Object obj) { return true; } }
{com.company.A@ea60=11, com.company.A@1560b=22, com.company.A@4d0=com.company.B@5451c3a8}
true
true
com.company.A@ea60---->11
com.company.A@1560b---->22