深入理解集合(1)

在学习集合之前首先要思考一个问题,为什么要有集合?

​ 为了方便对多个对象进行操作,我们就必须对这多个对象进行存储,而要想对多个对象进行存储就不能是一个基本的变量,而应该是一个容器类型的变量,到目前为止,我们学习过了哪些容器类型的数据呢?StringBuilder,数组,StringBuilder的结果只能是一个字符串类型,不一定满足我们的需求,所以我们目前只能选择数组了,也是就我们前面学习过的对象数组.但是,数组的长度是固定的,适应不了变化的需求,那么,我们该如何选择呢?这个时候,Java就提供了集合类供我们使用,而且集合的长度是可变的.

集合图:

img

在这里插入图片描述

区别:

Set集合:Set集合中存储的对象没有特定顺序,且不允许重复 

List集合: List集合中存的对象是有序,且允许重复 

Map结合: Map集合是一种映射关系即key-value键值对, key必须保证唯一,但是value可以不唯一 ,所以可以将Map集合看做一个Set集合+List集合的 映射关系即 key相当于Set集合 Value相当于 List集合

1.List集合

list集合是一个接口,其包含两个实现类(ArrayList)(LinkedList)
通过向上转型可以将实现类提升为父类,然后调用List接口中的方法.
代码示例:
List list = new ArrayList();
List list = new LinkedList();
ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。

ArrayList自动扩容原理:
首先,ArrayList定义了一个私有的未被序列化的数组elementData,用来存储ArrayList的对象列表(注意只定义未初始):private transient Object[] elementData.
其次,以指定初始容量(Capacity)或把指定的Collection转换为引用型数组后实例化elementData数组;如果没有指定,则预置初始容量为10进行实例化。把私有数组预先实例化,然后通过copyOf方法覆盖原数组,是实现自动改变ArrayList的大小(size)的关键.
简述就是:创建一个新的数组覆盖了原先的数组.

LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列,同时又可以看作一个栈.关于栈或队列,现在的首选是ArrayDeque,它有着比LinkedList(当作栈或队列使用时)有着更好的性能.
LinkedList底层通过双向链表实现,双向链表的每个节点用内部类Node表示。LinkedList通过first和last引用分别指向链表的第一个和最后一个元素。注意这里没有所谓的哑元,当链表为空的时候first和last都指向null.

ArrayList 插入删除慢,查找快;LinkedList 则相反,插入和删除都比较快,而删除则比较慢。
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值