编程界流传着一句话:面试造火箭、工作拧螺丝。现在的面试确实有点过分了,几千块工资要求面试者什么都会,例如下面这个4k工资的实习JAVA岗,我都怀疑他公司中能有几个人都掌握了这些技术。
![359c5a0f446c620706ccadc38857e51b.png](https://img-blog.csdnimg.cn/img_convert/359c5a0f446c620706ccadc38857e51b.png)
不过,为广大同胞们吐槽完社会的压力后,是该反思出现这一状况的原因,无非是技术学习门槛变低了,技术人群庞大了(得益于众多培训机构),而互联网的蛋糕越分越小了,企业的经营压力也变大了,所以最终苦逼的就是我们这些创造世界的程序boy。
回到今天的主题,数据结构一直是我们程序员关注的重点,还没工作的人可能觉得他并不重要,但是哪怕大厂面试都会涉及这方面的知识。已经工作的同胞们就能深深体会到,数据结构也是衡量一个程序员技术的重要指标。
很多时候我们处理数据时,经常会用到数组、List、Map、Set等结构,然后这些结构有很多变种,如果要做到运用自如,首先必须对所有结构都熟悉,然后才能决定什么业务采用什么结构比较合适。
今天我们先来讲讲java中的List家族。
![da4c361f4b0e05742e574a075cb89a0b.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/cd2b362e41858a38aeba5c709b3500f7.png)
那vector是如何保证线程安全的呢?
方法
添加元素
public
获取元素
public
vector的增删改查方法都加上了synchronized关键字,以此保证同一时间只能有一个线程进入此方法,这样就保证了能正确扩容
Stack
stack继承于Vector,所以底层还是数组,但是他被当作栈来使用
方法
入栈操作
public
栈顶元素出栈操作
public
获取栈顶元素
public
栈的使用场合比较少,大家了解就行
这期的分享到此结束,有疑问的可以私信我,也可以关注公众号【搬运工大雄】,加我微信好友。