java数据结构

        问题总是在具体需求出现的才会显现的,我之前遇到一个需要将一串字符串,按照逗号分隔来,用一个数组来包装这些数据,很简单的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倍压力。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值