问题总是在具体需求出现的才会显现的,我之前遇到一个需要将一串字符串,按照逗号分隔来,用一个数组来包装这些数据,很简单的split功能,返回的就是一个数组。
可我在这之后想再往里面添加元素,但是发现你要操作的对象是个数组,而不是一个集合。很尴尬,于是不得不将数组编程集合然后再添加。仔细想想为什么数组会那么不方便,请教了大神,扯到到计算机原理才总结出自己的理解。
首先,假设有一个数组<E>,在内存空间中是从100开始,长度为100。记为a[100,100]那么理解吧,同时再创建一个从200开始,长度为100的b,记为b[200,100]。好,到目前为止,计算机已经满足你的需求了。然而你现在发现a添加数据后,有几个数据放不下,你和计算机说再给我几个为止,从200-200+x的位置给我,它能同意吗?空间都已经给b了。所以,像计算机这种多任务,多线程的东西,必然要存在着线程安全,内存安全这种机制,然而也就是这种机制,约定了一切基于计算机开发的必须按照它的要求来开发。
3个月后的今天,我在再次整理回顾的时候,发现之前的理解还是片面,不完整,现在即将再次完善。首先,我是想通过深入了解ArrayList和LinkList这之类的东西,去浅尝下计算机的数据结构这个东西,不是专业出身的就是那么的蛋疼......现在就以刚刚的二个为例子展开分析,
* 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
* 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
* 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
好了这个简单的知道之后,那个引出了2个陌生的东西,数组和链表,对于数据结构这种东西,学起来是很枯燥乏味,但是没办法啊,强迫自己至少懂点基础的吧。
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
*C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。
(1) 从逻辑结构角度来看
a, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
b,链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
(2)从内存存储角度来看
a,(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
b, 链表从堆中分配空间, 自由度大但申请管理比较麻烦.
总结下,主要是通过几个日常的知识,引出了后面的庐山真面目,这不仅仅是为了写出来理解,概念性的很容易忘记,写下来以后也可以浏览,补全之类的。非专业出身的更加任重道远,绝对的,合理估计,会是专业出身的3倍压力。