区别的根本
ArrayList和LinkedList的区别,简单说ArrayList使用get的速度快,LinkedList删除和插入快,get/set慢;再ArrayList不扩容的情况下只是通过add方法添加对象,那么他俩的速度是一样的;
说白了不过是数组和链表之间的区别
可以说List接口的实现方式有用数组结构实现的就是ArrayList,有用链表结构实现的就是LinkedList;反过来也可以说ArrayList对数组进行封装了一层,并且满足List接口,LinkedList也一样
专业解释+白话解说
先说数组Array: 首先你要明白一件事儿,堆空间中一个对象占用空间的大小就是由对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)来这三个参数决定的;当然如果是数组对象会多出四个字节存储数组长度;不信的话可以看打印对象大小的方法,这篇文章有打印对象大小的;数组对象里是不包含对象本身的,都是存储的对象引用,也就是地址;我们找到了引用就是找到了对象;
还有内存空间是连续的地址,每个地址都有自己的数据下标,就是简单说就是第多少位;每一位就是1bit,每个bit位就是0或者1,每8bit就是一个字节,不管是什么样格式的数据,本身其实都是0和1,只是不同的排列方式和解析方式创造出各种各样格式的数据,如果理解这个那么数组和链表的区别就很容易理解了
假设Student student = new Student();Person person = new Person();Sugar sugar = new Sugar();这几个装饰作用,仔细看下面的
Object o1 = new Object();Object o2 = new Object();Object o3 = new Object();Object o4 = new Object();创建了这些对象然后又创建数组对象 Object[] objects = new Object[5]黄色的空间就是; 当然正常情况下内存空间肯定是挨着分配,不会像我画图这么浪费,一个方格代表四个字节的大小

每个对象存储在数组中,只是存储个地址,所以只占用了四个字节;数组是开辟了一块连续的内存空间存储对象,就像你在操场上,有连续10个人排队,此时老师让你这队伍的人员报数,不论是按照脚下的位置,还是人数都对得上,报数没问题。假如把其中的某个人拉出来,那么后面的人肯定每个人都要上前一步,重新把队伍排整齐,如果不把队伍重新排整齐,那么老师让你报数的时候,后面空缺的人就懵了,我到底是按照队伍的人数顺序还是按照脚下标注的位置报数;
所以ArrayList在中间插入和删除操作本身性能没问题,有问题的地方就是要重新调整队伍;尤其是人员超出的时候,就要重新找一块更大的地儿,把旧的人员按顺序插入进去,还要把新的对象放入进去;想想这操作就很大,您想和性能好的了吗
为什么get比较快,因为内存空间是连续,而且每四个字节就存储一个变量,get(0)和get(n)的速度是一样的,每个位置差四个字节,通过计算就能得到具体内存地址了
下面来说链表:链表结构是有个指针;可以理解为每个人手里都有张名片;比如,在一个有坐标系的操场上,站了很多人,但是一支特殊的队伍缺没有排在一起;他们是通过名片维护关系的;第一位是个叫张三的,张三手里有李四的名片,李四手里有王五的名片,王五手里有刘六的名片,这些人也是在操场上排队的,但是都是淹没在人群中的,但是每个人的名片上写着他们的具体坐标,所以可以通过手持名片的方式,让他们排成一个特殊的队伍;因为他们脚下的坐标和他们的队伍顺序不像数组是有规律的,数组的排序顺序和坐标顺序相同;但是链表是没有规律的;这个时候你想找第3个人;所以你只能从第一个人开始找,内心开始查数;找到一个人这个数加1,直到查到3位置,必须一个一个查找,所以LinkedList的get性能差一些,但是插入块,只需要交换几次名片就可以把人插入到队伍中去了;为什么不把每个人的名片上标记上顺序?如果一旦队伍中间插个人,那么后面每个人的名片都要更新,您想这性能好的了么?

像上图中,张李王李六四个人的位置和坐标完全没有任何逻辑关系;只能通过红色(名片、指针)箭头去查找,这就是链表
10万+

被折叠的 条评论
为什么被折叠?



