这一篇我们主要来学习容器的Map类。
我们学的是HashMap和Hashtable(注意t不能大写)。
HashMap和Hashtable都可以存放类对象。
用put存入,get取出。
举例:
Emp emp1 = new Emp("S001", "aaa", 1.2f);
Emp emp2 = new Emp("S002", "bbb", 3.4f);
Hashtable ht = new Hashtable();
ht.put("S001", emp1);
ht.put("S002", emp2);
...
可以一直往里面加。
HashMap hm = new HashMap();
hm.put("S001", emp1);
hm.put("S002", emp2);
...
但是HashMap可以存放空元素:
比如:
HashMap hm = new HashMap();
hm.put(null, null); / /是可以的
Hashtable不可以:
HashMap ht = new HashMap();
ht.put(null, null); / /是不可以的
在使用方式上,HashMap和Hashtable没有什么区别。
但是他们之间还是有不同的:
Hashtable是同步的,线程安全的。 (同步就会损失效率,所以Hashtable效率低)
HashMap是异步的,线程不安全的。(异步效率高)
这里所说的线程安全和不安全,我们可以理解为对同一个共有数据的操作。
线程安全则是可以先对共享的数据进行上锁,然后再对共享数据进行操作(增删改查)。
类似于我们uCOS/FreeRTOS中的信号量上锁机制。
所以我们在高并发的时候使用Hashtable,而不用HashMap对共享的数据进行线程安全保护。否则会产生“脏数据”,导致系统的实时性能不好。