一.HashTable和HashMap
Hashtable是JAVA中依靠哈希表来实现的,学习数据结构的时候我们已经知道哈希表是基于数组加链表去实现的。哈希表最重要的是扩容机制和哈希冲突,当负载因子大于0.75时会触发扩容机制。哈希冲突是多个数通过哈希函数映射到同一位置。为了解决哈希冲突会在数组上挂一个链表,往链表上去插入元素。HashMap底层是依靠这种原理来实现的,是数组加链表加红黑树。而TreeMap底层是一颗二叉搜索树,HashMap增删查改的时间复杂度都为o(1),但HashMap和TreeMap是线程不安全的,在多线程的场景下会产生线程安全问题,java中的HashTable是线程安全的。
二.HashTable
Vector和HashTable属于java很早之前的集合,HashTable给每个方法加了锁,加了锁不一定线程安全,不加锁也不一定线程不安全。
虽然HashTable给每个方法加了锁,但是如果添加元素的同时删除元素,这2个操作整体不是原子性的,在多线程的情况下执行结果可能发生错误。所以vector/ HashTable这样的集合类,虽然加了synchronized也不能保证一定线程安全,同时在单线程的情况下,可能因为加锁影响效率。
HashTable是给方法加了锁,