Java集合总结

List:

ArrayList:允许null,初始容量为10,底层使用数组实现,非线程安全,可扩容并且一次扩容1.5倍,可指定出事容量。

优点:查找快(因为ArrayList底层使用数组实现,数组的特点就是可以随机取值)。

缺点:增删慢(数组中的数据必须是连续的,如果被删除的数据在数组的中间,那么被删除的数据后边的元素必须依次向前移动,这很显然是浪费时间的;当添加数据的时候,如果当前数组的容量够用那还好说,但是如果数组的容量不够就会触发扩容,由于数组的大小是不变的,因此扩容必须重新定义一个数组,然后将旧的数组中的元素依次复制到新数组当中,这显然浪费时间)。

LinkedList:允许null,无初始容量,底层采用双向链表,非线程安全,无需扩容且大小动态变化。

优点:增删快(链表固有的特性,删除的时候无需重新定义,只是将被删除的元素移除然后将前后元素的引用连接即可)。

缺点:查找慢(不能随机取值,需要根据链表依次扫描)。

Vector:允许null,初始容量为10,底层使用数组实现,线程安全,可扩容并且一次扩容1.5倍,可指定出事容量。

优缺点:类似ArrayList。

Stack:继承Vector,为栈,符合栈的特性,底层使用数组,可自动扩容。

Set:

HashSet:

LinkedHashSet:

TreeSet:

Map:

HashMap:底层采用数组,数组每一个元素形成链表,key可有一个为null,value可有多个null,非线程安全。

注意: hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.

   a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.

   b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象

       才可以真正定位到键值对应的Entry.

   c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value

HashTable:底层采用数组,数组每一个元素形成链表,key和value都不能为null,线程安全。

注意:

1、用作key的对象必须实现hashCode和equals方法。

2、不能保证其中的键值对的顺序

3、尽量不要使用可变对象作为它们的key值。

TreeMap:底层采用  ,利用红黑树实现排序,排序依赖于hashcode和equals,

注意:由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.

   a. Comparator可以在创建TreeMap时指定

   b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.

   c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.

LinkedHashMap:使用双向链表保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值