关于数组和列表

以往只是会用ArrayList,但是我并不清楚它的工作原理和底层的实现,现在先简单总结下数组和列表的信息。
数组,是长度固定的,因此很明显要做添加或者删除的时候会比较复杂。比如,在数组中间添加一个元素,那么在待添加位置后面得全部元素的索引都需要更新,删除也是如此。但是同样因为索引的存在,只要找到索引就可以找到对应的元素。而且数组是连续的储存结构,所以作查询速度效率高。
——————
列表,是由一个个结点组成的。结点包括了数据信息和指针信息(下一个元素的地址)。所以只要把这些结点通过自身的指针信息链接起来,就可以形成一条直线上有关联的数据,就是列表。由于结点的组成属性,只要做添加删除等改变列表内容的操作,只要去修改待操作的结点数据和指针信息,以及待操作结点的上一个或者下一个结点的指针信息即可(之前我已经看过和模仿过linkedlist的源码)。所以无论存在内存哪个地址都是可以找到下一个元素.这里说明下,列表是不连续的储存结构。
——————
举个例子,对比以上两种数据结构的查询。
数组元素:100个同学,每个同学都有单独索引。我要查找A同学,我只需要查找0到99的索引,看每个索引对应的同学是不是A即可。而且这100个同学还是在同一个教室,所以找到这个人也快。(因为数组在是连续的储存结构,是在一个地址连续的字节块中,这里欢迎指正)
——
列表元素:100个同学,每个同学有自己的名字,和他知道下一个同学是谁。我要查找A同学,首先我得找到第一个同学(因为要找人,所以得一个个去查看),然后通过第一个同学得到他的信息比较,如果不是,在第一个同学处得到第二个同学的信息再去小第二个同学重复刚刚的操作,这里还有一点,这些同学可能不在同一个地方,这样就加多了查找的时间(增加系统的开销,列表是不连续的储存结构呀)。

以上这两个例子是我肤浅的见解,等我学习更多了再回来更新

猜你喜欢

转载自cloudgan.iteye.com/blog/2344981