Java集合

  • Java最顶层的接口是Iterable(迭代);
  • Collection接口,继承了Iterable接口;
  • List和set接口,继承了collection;
  • Map是个独立的接口;
  • List主要有ArrayList和LinkedList两个实现类;

ArrayList和LinkedList,这两者的区别也很明显,从其名称上就可以看出。
ArrayList底层是基于数组实现的;当添加第一个值时,开辟空间,默认开辟10个长度的数组;当里边数值超过10时,会自动扩容,每次扩容到它的1.5倍;由于他的扩容机制是创建1个新的数组,然后把就数组的值给新数组,效率比较低。所以我们在做ArrayList的优化时,可以根据预估数据量给他一次性开辟好空间,避免自动扩容。另外由于数组有下标,所以查找时非常方便;但插入时,可能导致下标重新指定。所以效率可能较低;

LinkedList是基于双向列表的结构;当给里边添加值时,首先把当前值创建成一个node对象;然后把当前对象赋给first列最后1个值的next中;同时,把last列直接给到node的next中。然后把当前node再赋给last中;这样就形成了一个双向列表;
再插入值时,只需要把插入节点的next先拿出来,然后放到当前node的next中。然后把当前node再给到插入节点的next中就可以了,所以增删操作比较容易完成,但是对于随机访问的效率比较低。

  • Set主要有HashSet和TreeSet两个实现类
  • Map主要有HashMap和TreeMap两个实现类

hashMap底层是一个数组+Entry对象的单向列表组成的;在创建是默认不开辟空间;在添加第一个值的时候开辟空间,默认数组长度为16;Entry里边主要包含key、value、next和hash4个值;当给hashmap添加1个值时,首先先把当前值new 成一个entry对象;hash是根据key计算出来的hashcode值。把这个值和数组的长度求余,根据这个余数来确定entry存放在数组的位置;找到位置以后,首先把位置中原先的值,拿出来,放到当前entry的next里边;最后在把当前entry放到这个位置;hashmap的默认扩容因子是0.75;当map中的值超过3/4时,会自动扩容,扩容到原理的2倍;
jdk1.8中,当某个列表长度大于8,总大小大于64时,就会转为红黑树,红黑树是一种完全平衡的二叉树;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值