数组和链表的尔虞我诈

作为java开发的程序媛,为了想买点好的胭脂水粉,奈何囊中羞涩的时候,就会考虑投奔新的东家来满足小小的心愿,想找个新东家,免不了考验你一把,面试机关重重,八九不离十的就是java基础、数据结构啥的。这要是都不会,就买袋面粉吧,提什么胭脂水粉。
被Cue到最多的就是数组和链表的区别了,他们两个总被关联到一起,爱恨情仇,尔虞我诈,势必要争个你强我弱,奈何这都是人类在作祟,说不定人家不争不抢相处的和平着呢,好了,废话太多,进入正题。

  • 数组
    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不同滴。
    Java 语言中提供的数组是用来存储固定大小的同类型元素。
    只有声明了数组变量,才能在程序中使用数组。也就是说,你想吃外卖,首先得有这么一家饭店,你才能去点啊。
    声明数组的两种方式,举个栗子:
String[] myString;  //首选的方法
String myString[];  //也是对的奥,只不过不首选

你会问了,这有啥区别啊,一个[]跳来跳去, 其实这要追溯到java的起源了,其实java也可以叫做C/C++ like语言,String myString[];这种写法其实是为了向C/C++致敬,也就是让C/C++的猿媛们能快速理解而已,两种写法一样一样的奥。不过还是建议第一种写法,毕竟java就是java,还是要有自己的个性的。

  • 链表
    链表是一个很重要的数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。他在程序设计中具有举足轻重的地位。我们都知道C/C++都是有指针的来实现链表结构的,java中取消了指针,很多人就认为没有呀!java好low啊都不能实现链表,其实不然,知识量少了吧,java才是能更好的实现链表呢,要不人家怎么叫C/C++like呢。既然不想叫指针,那我们就叫对象引用吧。
    链表是个庞大的家族,单向链表,双向链表以及循环链表是家族的三大长老。
    声明链表,举个栗子:
public class Node {    
    String data;//数据域  
    Node next;//链域,指向下一个节点
    public Node(String data) {  
        this.data = data;  
        next = null;  
    }    
} 

理论叨叨了一堆,我就不喜欢看文字,喜欢看图,话不多说,上图!

  • 数组

    这里写图片描述
    (盗来的图,请见谅,实在是太喜欢了)

    数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。也就是说,如果我们要用到数组,我们就必须事先知道数组的大小。但是实际情况往往不是这样,我们有时根本就无法知晓到底需要多大的数组,只能试着去定义数组的大小,这就出现了两种情况:

    1、事先定义的数组大:空间浪费了。    
    2、事先定义的数组小:数组溢出了。
    

    因为数组并不能根据数据的增加和减少动态的加载内存的大小,所以上面两种情况是无法避免的。

  • 链表

    还是盗来的图
    链表恰好完美的解决了以上数组出现的问题。
    链表可以动态的根据数据的增减来对存储进行分配,插入和删除更加方便。为什么说链表插入和删除更方便呢,因为数组中插入、删除数据项时,需要移动其它数据项,而链表的插入与删除时,只需要改变个别元素之间的关系即可,这大大提高了链表的删除与插入的速度。

  • 区别
    数组:连续存储型。优点:因为连续存储,所以查找起来比较方便,就像被编上号的人,一下子就能在人群中找到。缺点:由于数组是不能动态加载大小的,所以在增加、插入和删除的时候,就需要很大的力气,首先得棒打鸳鸯把两个牵着手的数组拆散,腾出空间之后,再插入,增加和删除也是类似。随之而来的,插入或者删除的这个小人之后那些兄弟的编号都要改变。这动作也太大了。
    链表:动态存储型。优点:不需要事先知道内存有多大,用的时候申请就可以。根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。缺点:查找起来比较麻烦,因为不像数组一样连续编号,所以效率很低。

两种各有各的好处,链表方便删除和插入,数组方便查询等。

应用场景:

数组应用场景:
1、数据比较少;
2、经常做的运算是按序号访问数据元素;
3、数组更容易实现,任何高级语言都支持;
4、构建的线性表较稳定。
链表应用场景:
1、对线性表的长度或者规模难以估计;
2、可以频繁做插入删除操作;
3、构建动态性比较强的线性表。

总结:

数组静态分配内存,链表动态分配内存;
数组在内存中连续,链表不一定连续;
数组元素在栈区,链表元素在堆区;
数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值