一、map的分类和常见的情况 1、什么是线程同步 线程同步是指多线程通过特定的东西来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步那线程之间是各自运行各自的。 2、map的分类 java为数据结构中的映射定义了一个接口java.util.Map,他有四个实现类,分别是:HashMap,HashTable,LinkedHashMap和TreeMap。 Map主要用于存储键值对,根据键得到值,因此不允许键重复,但允许值重复. 3、HashMap (1)HashMap是一个最常用的Map,它根据键的HashCode值来存储数据,根据键可以直接获得它的值,具有很快的访问速度,遍历时,取得数据的顺序完全是随机的。 (2)HashMap最多只允许一条记录的键为null,允许多条记录的值为null。 (3)HashMap不支持线程同步,即任意时刻可以有多个线程同时写HashMap,这样对导致数据不一致,如果需要同步,可以使用synchronziedMap的方法使得HashMap具有同步的能力或者使用concurrentHashMap。 4、HashTable (1)HashTable与HashMap类似,它继承自Dictionary。 (2)它不允许记录的键或值为空。 (3)它支持线程的同步,即任意时刻只有一个线程能写HashTable,因此也导致了HashTable在写入时比较慢。
hashMap:线程不安全,无序(HashMap不保证遍历的顺序和插入的顺序是一致的)。HashTable类是线程安全的,它使用synchronize来做线程安全,全局只有一把锁,在线程竞争比较激烈的情况下hashtable的效率是比较低下的。因为当一个线程访问hashtable的同步方法时,其他线程再次尝试访问的时候,会进入阻塞或者轮询状态,比如当线程1使用put进行元素添加的时候,线程2不但不能使用put来添加元素,而且不能使用get获取元素。所以,竞争会越来越激烈。相比之下,ConcurrentHashMap使用了分段锁技术来提高了并发度,不在同一段的数据互相不影响,多个线程对多个不同的段的操作是不会相互影响的。每个段使用一把锁。所以在需要线程安全的业务场景下,推荐使用ConcurrentHashMap,而HashTable不建议在新的代码中使用,如果需要线程安全,则使用ConcurrentHashMap,否则使用HashMap就足够了。
5、LinkedHashMap (1)LinkedHashMap是HashMap的一个子类,保持了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时用带参数,按照应用次数排序,在遍历的时候会比HahsMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和它的容量有关。 6、TreeMap TreeMap实现sortMap接口,能够把保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的,TreeMap底层是红黑树。 7、什么情况用什么类型的Map: 在Map中插入,删除,定位元素:HashMap(使用最多,随机存储) 要按照自定义顺序或自然顺序遍历:TreeMap(插入的值有序) 要求输入顺序和输出顺序相同:LinkedHashMap(还可以按读取顺序排列,插入的顺序有序) Hashtable(线程安全)
|