list初始化赋值_大雄手撕java数据结构——List

编程界流传着一句话:面试造火箭、工作拧螺丝。现在的面试确实有点过分了,几千块工资要求面试者什么都会,例如下面这个4k工资的实习JAVA岗,我都怀疑他公司中能有几个人都掌握了这些技术。

359c5a0f446c620706ccadc38857e51b.png

不过,为广大同胞们吐槽完社会的压力后,是该反思出现这一状况的原因,无非是技术学习门槛变低了,技术人群庞大了(得益于众多培训机构),而互联网的蛋糕越分越小了,企业的经营压力也变大了,所以最终苦逼的就是我们这些创造世界的程序boy。

回到今天的主题,数据结构一直是我们程序员关注的重点,还没工作的人可能觉得他并不重要,但是哪怕大厂面试都会涉及这方面的知识。已经工作的同胞们就能深深体会到,数据结构也是衡量一个程序员技术的重要指标。

很多时候我们处理数据时,经常会用到数组、List、Map、Set等结构,然后这些结构有很多变种,如果要做到运用自如,首先必须对所有结构都熟悉,然后才能决定什么业务采用什么结构比较合适。

今天我们先来讲讲java中的List家族。

da4c361f4b0e05742e574a075cb89a0b.png

List常用的实现类有:ArrayList、LinkedList、Vector、Stack,下面我们一一讲解每种结构。

ArrayList

ArrayList是最常用的列表,其底层结构是Object[]数组,故查询时间复杂度是O(1)

属性:

//保存元素的数组

方法:

构造方法

//无参构造方法,初始化数组为空数组{}

申请空间,增加数组长度

//minCapacity:扩容的最小长度。前面说到数组长度不足时,就会调用该方法扩大数组空间

添加元素

public 

读取元素

public 

删除元素

public 

以上是ArrayList的增删查方法,改就不说了,结合增查的方法自己去推断一下。ArrayList是纯数组操作,好处就是查询速度非常快,但是增删就不行了,因为涉及到扩容和元素移动的操作。大数据量插入ArrayList的情况下,最好先指定列表的长度,否则会因为一直扩容导致效率低下。

LinkedList

LinkedList的底层结构是双向链表,查询的时间复杂度是O(n),但是增删速度快,而且不涉及扩容,适合用于堆、栈、队列等操作。

节点

//节点是一个内部类

一定要注意区分链表的头尾节点和节点中的前后节点,为了防止混淆,节点中的前后节点称为左右节点

属性

//链表长度

方法

尾部插入法

//尾部插入法的内部调用了一个修饰符为default的方法linkLast()

d2f9e1640f93643eaed1bfcdfa90a9c4.png

头部插入法

public 

获取元素

public 

删除元素

public 

LinkedList的方法还有很多,例如pop()、poll()、peek()等相关方法,读者可以自行查阅,这里主要是为了理解其底层结构,所以就不一一细说了。

很多业务下都需要在ArrayList和LinkedList两种结构中抉择,选择一个比较合适的结构不仅能让你的程序效率更好,还能升职加薪哦!

Vector

Vector和ArrayList的数据结构相同,不同的是Vector是线程安全的,而ArrayList在并发下容易出现数组越界或缺失元素等异常,在了解vector之前,我们先看看ArrayList为什么是线程不安全的。

ArrayList的数组默认长度为10,假设现在已经有9个元素了,当再增加一个元素时,暂时不会扩容,此时size=10,当添加第11个元素时,add方法会先调用grow方法进行扩容,然后再添加元素,否则会造成数组越界。

如下所示,当已经有9个元素时,两个线程A、B同时执行add方法,就会造成数组越界

cd2b362e41858a38aeba5c709b3500f7.png

那vector是如何保证线程安全的呢?

方法

添加元素

public 

获取元素

public 

vector的增删改查方法都加上了synchronized关键字,以此保证同一时间只能有一个线程进入此方法,这样就保证了能正确扩容

Stack

stack继承于Vector,所以底层还是数组,但是他被当作栈来使用

方法

入栈操作

public 

栈顶元素出栈操作

public 

获取栈顶元素

public 

栈的使用场合比较少,大家了解就行

这期的分享到此结束,有疑问的可以私信我,也可以关注公众号【搬运工大雄】,加我微信好友。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值