Collection详细总结

Collection集合

Collection的一些常用的实现类
请添加图片描述

List(允许元素重复)

ArrayList 、Vector 和LinkedList

  1. 扩容机制:

ArrayList 如果调用默认构造器创建对象的话初始化为空,当第一次调用add函数添加元素时候,默认扩容为10个,以后每次扩容为1.5倍(当不够放的时候进行扩容,比如添加第11个元素时候进行扩容);如果调用带参数构造器,初始化为参数的数值大小的数组,以后每次扩容为1.5倍(不够放的时候进行扩容)

Vector 如果调用默认构造器创建对象的话,初始化为大小为10的数组,以后每次扩容为2倍(当不够放的时候进行扩容,比如添加第11个元素时候进行扩容);如果调用带参数构造器,初始化为参数值大小的数组,以后每次扩容为2倍(不够放的时候进行扩容)

LinkedList 采用的是双链表结构进行保存数据,也就是说它的增删效率高,查询和修改效率低

  1. 三者的不同:
  • ArrayList、Vector采用object数组储存数据
  • LinkedList采用双链表结构进行存储数据
  1. 使用顺序
  • 如果多线程 采用Vector ,因为Vector有线程安全,但是效率比较低
  • 如果单线程:查改多的使用ArrayList,增删次数多的使用LinkedList

Set(不允许元素重复)

HashSet、LinkedHashSet、TreeSet

  1. 底层采用结构
  • HashSet采用的是数组+单链表的结构,无序,底层其实是使用HashMap的对象
  • LinkedHashSet采用的是数组+双链表,有序(添加顺序和输出顺序相同),底层使用的是LinkedHashMap的对象
  1. 扩容机制
  • HashSet的table表在第一次添加元素的时候初始元素为16个,门槛值为12个,当添加元素个数大于门槛值的时候(也就是在添加第13个时候)会进行一次扩容,扩容规则:table长度和门槛值都变成双倍。或者在某条链的个数大于8个的时候(在添加第9个的时候)会进行判断是否把该链进行红黑树化,如果此时table长度大于等于64进行红黑树化,否则继续进行扩容。
  1. 判断是否添加元素
    由于HashSet、LinkedHashSet、TreeSet 不能添加重复的元素,所以底层源码对于判断两个元素是否是同一元素很关键。
    HashSet和LinkedHashSet判断是否为同一元素方法:拿Key的hashCode参与运算得到hash值,通过hash值计算得到在table表的位置i。如果i位置没有元素,直接添加新元素。如果i元素上有元素了,对i 这条单链表进行遍历比较。比较内容需要同时满足两条条件才能视为同一元素:1.两个key的hash值相等2.两个key是同一对象或者调用key的equals方法比较相等。如果发现同一元素了,直接返回,不添加该元素
    TreeSet采用的是对象的compareTo方法进行比较,所以添加的元素前提是有compareTo方法,也就是要实现Comparable接口。如果在比较过程中方法返回0,则不添加该元素。在TreeSet初始化的过程也可以调用有参构造器,传入一个实现了Comparator的匿名内部类,来实现集合的排序

  2. 使用顺序:
    无序:HashSet
    有序:LinkedHashSet
    排序: TreeSet

总结

当存储的数据为单列时候可以使用Collection集合,如果允许元素重复则使用List的实现类,如果不允许元素重复则使用Set的实现类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值