Java之集合框架(四)

HashMapHashtable是Java中两种常用的哈希表实现,它们主要在以下三个方面存在区别:

  1. 产生时间:Hashtable产生于JDK1.1,而HashMap产生于JDK1.2。
  2. 继承体系:Hashtable继承自抽象类Dictionary(已废弃),而HashMap继承自抽象类AbstractMap。这意味着HashTable的父类是已经废弃的Dictionary类,而HashMap的父类是AbstractMap类。
  3. 对Null键和Null值的处理:在Hashtable中,如果遇到null键或null值,它会抛出空指针异常。而在HashMap中,它允许null键和null值的存在。这主要是因为在代码中对null值的处理不同。
  4. 效率:因为Hashtable要保证线性安全,所以其效率相对于HashMap(非线程安全)来说是较低的。
  5. 初始容量和每次扩充容量:当创建HashTable和HashMap时,如果不指定初始容量,HashTable的默认初始容量为11,之后每次扩充,容量变为原来的2n+1倍。而HashMap的默认初始容量为16,之后每次扩充,容量变为原来的2倍。
  6. HashMap的底层实现 是数组 + 链表/红黑树, 当链表大于 8 时 会将链表转为红黑树; 删元素时 红黑树小于 6 会转为链表。
  7. Hashtable的底层实现 是数组 + 链表

总的来说,HashMap和HashTable各有其特点。在选择使用哪种哈希表时,需要根据实际应用场景和需求进行决定。

HashSet、LinkedHashSetTreeSet都是Java中的Set接口的实现,主要区别在于它们实现的方式和性能上。

  1. HashSet:(HashMap) 根据对象hashcode值来决定存储位置,不保证对象元素的排列顺序。HashSet使用哈希表实现,元素是无序的。添加、删除操作时间复杂度都是O(1)。存null,不保证顺序。
  2. LinkedHashSet:(LinkedHashMap)通过链表来保持对象元素在插入时的顺序。LinkedHashSet内部是一个双向链表结构,所以它的插入是有序的,时间复杂度是O(1)。存null,元素插入顺序。在迭代访问Set中的全部元素时,LinkedHashSet比HashSet性能好,但是插入时性能稍微逊色于HashSet。
  3. TreeSet:(TreeMap)确保对象元素处于排序状态。TreeSet内部结构是一个树结构(红黑树),元素是有序的在构造中使元素具有可比性。添加、删除操作时间复杂度为O(log(n))。TreeSet提供了first()、last()、headSet()、tailSet()等方法来处理有序集合。

总体而言,这三种Set实现的主要区别在于它们的内部实现方式以及元素排序方面。HashSet和LinkedHashSet是unordered的集合,而TreeSet是一个排序的集合。在选择使用哪种Set实现时,需要根据实际应用场景和需求进行决定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值