集合框架

一、List

List接口的常见实现类一共三个,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:

  1. ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
  2. Vector:底层数据结构是数组,查询快,增删慢。线程安全,效率低。
    Vector相对 ArrayList查询慢(线程安全的)
    Vector相对LinkedList增删慢(数组结构)
  3. LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。

Vector和ArrayList的区别:

  • Vector是线程安全的,效率低
  • ArrayList是线程不安全的,效率高
  • 共同点:都是数组实现的

ArrayList和LinkedList的区别:

  • ArrayList底层是数组结果,查询和修改快
  • LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
  • 共同点:都是线程不安全的

List这三个实现类到底该使用谁?

  • 查询多用ArrayList
  • 增删多用LinkedList
  • 如果都多ArrayList

二、Set

Set接口的常见实现类一共三个,分别为TreeSet、hashSet和linkedhashSet。Set不允许重复元素且没有顺序,只能允许一个null值。

1、hashSet:

  • 是基于Hash算法来实现的,功能是能快速查到到检索的对象,hash算法在于速度,查询某个元素是根据hashCode()值计算出存储位置从而找得的
  • 不会记住添加顺序.添加顺序位置随机
  • 不会添加重复元素,在同一个集合输入相同元素,add()方法返回false,且新元素不会加入
  • HashSet类似于HashMap的key,把key封装起来就HashSet,
  • HashSet访问元素也是根据hashCode()的值来快速定位
  • HashSet比较两个元素相等的标准是通过equals()方法与hashCode( )方法比较的对象返回值相等,但如果两个元素的equals相等,hashCode()不相等也是会添加成功

2、linkedhashSet:

  • 也是根据hashCode()来访问元素位置,但同时使用链表来维护元素的次序,使元素维持插入的顺序保存起来,遍历输出后也是按照添加顺序输出
  • 也不允许集合元素重复。
  • 因为需要维持元素的插入顺序,性能比HashSet低
  • 访问Set里的全部元素有很好的性能,因为它以链表来维护顺序

3、TreeSet:

  • 要求内部元素实现Comparable接口
  • 使用树结构实现(红黑树),集合中的元素进行排序
  • 其中自然排序与自定义排序

三、Map

Map接口的常见实现类有HashMap和HashTable。

Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型了。造成这样的原因一方面是因为Hashtable是线程安全的,效率比较低。

它们之间的区别如下:

  1. 父类不同:HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary。
  2. 线程安全性:Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步。HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。
  3. 初始容量不同:Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n为上一次的长度)。而HashMap的初始长度为16,之后每次扩充变为原来的两倍。
  4. 计算哈希值的方法不同:Hashtable直接使用对象的hashCode。而HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值