20172313 2018-2019-1 《程序设计与数据结构》第四周学习总结

20172313 2018-2019-1 《程序设计与数据结构》第四周学习总结

教材学习内容总结

  • 列表集合
    • 有序列表: 其元素按照元素的某种内在特性进行排序。(有序列表中的元素具备内在关联,这种关联定义了元素之间的顺序)
    • 无序列表: 其元素间不具备内在顺序,元素按照它们在列表中的位置进行排序。(无序列表中的元素按使用者所选择的任意方式排序)
    • 索引列表: 其元素能够用数字索引来引用。(索引列表为它的元素维护一段连续的数字索引值)
  • Java集合API中的列表
方法 描述
add(E element) 往列表的末端添加一个元素
add(int index, E element) 在指定索引处插入一个元素
get(int index) 返回指定索引处的元素
remove(int index) 删除指定索引处的元素
remove(o object) 替代指定索引处的元素
set(int index,E element) 返回列表中的元素数量
  • 列表ADT
操做 描述
removeFirst 从列表中删除第一个元素
removeLast 从列表中删除最后一个元素
remove 从列表中删除某个元素
first 查看位于列表前端的元素
last 查看位于列表末端的元素
contains 肯定列表是否含有某个元素
isEmpty 肯定列表是否为空
size 肯定列表中的元素数量
  • 使用数组实现列表
    • 通常的的列表能够从两端添加或删除元素,但它们还有从列表的中间插入或删除元素。所以没法避免要移动元素。可使用环形数组方法,但当从列表中间插入或删除元素时,仍须要移动元素。
    • 重载equals方法以及实现Comparable接口是展现面向对象设计的极好示例。咱们能够建立集合的实现来处理各类尚未设计的对象,只要这些对象具备相同的定义和(或)类中提供对象间的某种做比较的方法。
    • 将向ArrayList类中诸如find之类的private方法独立出来有多种益处。首先,它使得本已复杂的remove方法的定义变得很是简单。第二,它使得咱们可以利用find方法来实现contains操做以及ArrayUnorderedList的addAfter方法。注意,find方法不会抛出ElementNotFound异常,它只是简单地返回值(1)以代表元素未找到。经过这种方法,调用程序能够决定如何处理元素未找到的状况。在remove方法中,这意味着抛出一个异常。而在contains方法中,这意味着返回false。
    • 在进行remove操做的时候,若是要删除的元素是列表的最后一个元素,在这种状况下,须要进行n次比较操做。事实证实,这种删除操做的实现正好须要n次比较和平移操做,所以该操做的复杂度为O(n)。若是使用的是环形数组实现,他只是提升了删除第一元素这样一种特殊状况下的性能。
    • 进行contains操做时,因为该方法执行的是列表的线性查找,所以最坏的状况是所查找的元素不在列表中,在这种状况下须要n个比较操做,于是该操做的复杂度为O(n)。
    • 与remove同样,每次运行add操做时须要进行那次比较和平移操做,所以该操做的复杂度为O(n)。
  • 使用链表实现列表
    • 进行remove操做时,与数组实现的人move操做不一样,链表实现的remove操做不须要评议元素来填补空袭。可是,在最坏的状况下,仍须要进行n次操做,已肯定目标元素不在列表中,所以remove操做的复杂度仍为O(n)。

教材学习中的问题和解决过程

  • 问题1:咱们能够分别使用数组和链表实现列表,那么使用数组实现的ArrayList和使用链表实现的LinkedList在空间复杂度和时间复杂度上的区别在哪?
  • 问题1解决方法:每一个对象插入到列表中时,链表实现须要更多的空间。LinkedList类其实是一个双向链表,所以其引用须要两倍的空间。ArrayList类在空间管理上比基于数组的实现方式更高效。这是由于,ArrayList集合是可变大小的,所以按所需动态分配空间。因此,无需一次申请大量的空间而形成浪费。列表是在须要时才增长空间。二者间最大的区别发生在访问列表中特定索引位置时。若是已知索引值,ArrayList实现可以在相同的时间内访问列表中的任意元素。LinkedList实现须要从一端或另外一端起对列表进行遍历,以到达特定索引值。
  • 问题2:在学习书上代码时,有这样一段话:ProgramOfStudy和Course类实现了Serializable接口。为了是某个对象能使用串行化进行存储,其类必须实现Serializable。在erializable中没有任何方法,它只是代表,该对象能够转换为串行化表示形式。 我对于Serializable接口了解的很少,也不太明白串行化在这里表示的是什么意思。
  • 问题2解决方法:html

    什么是Serializable接口?
    一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化
    什么是序列化?
    将对象的状态信息转换为能够存储或传输的形式的过程,在序列化期间,对象将其当前状态写入到临时存储区或持久性存储区,以后,即可以经过从存储区中读取或反序列化对象的状态信息,来从新建立该对象
    什么状况下须要序列化?
    当咱们须要把对象的状态信息经过网络进行传输,或者须要将对象的状态信息持久化,以便未来使用时都须要把对象进行序列化
    Serializable主要用来支持两种主要的特性:
    一、Java的RMI(remote method invocation),RMI容许像在本机上同样操做远程机器上的对象,当发送消息给远程对象时,就须要用到序列化机制来发送参数和接受返回值
    二、Java的JavaBean,Bean的状态信息一般是在设计时配置的,Bean的状态信息必须被保存下来,以便当程序运行时能恢复这些状态信息,这也须要序Serializable机制前端

  • 问题3:书上使用链表实现列表的remove操做示例中有下面这样的代码,我有些不太清楚这里if的判断条件是!found自身的boolean值仍是当前found的值是否发生改变。
if(!found)
   throw new ElementNotFoundException("LinkedList");
  • 问题3解决方案:!是一个一元运算符,运算对象是boolean类型的,若运算对象为true则返回false,若运算对象为true则返回false。!value的话value要是boolean值才能够进行运算。
    下面举的例子if(file!=null)就是若是file对象不为空,则执行if下面的语句。
    if(!value.equal("")) 显然value是一个string类型的,这里的!操做符并非对value进行运算的,而是对value.equal("")进行运算的
    equal()方法返回的值是boolean类型的
    if(!value.equal(""))整个意思是若是value不为空字符串(注意哦,不是不为空,这是有区别的),则执行if下面的于语句。

代码调试中的问题和解决过程

  • 问题1:在完成pp6_11编程项目的过程当中,调用addAfter()方法后,会提示我出现了空指针。
  • 问题1解决方法:在debug了以后,我发现我调用了addAfter()方法后,若是新添加的数位于该列表的末尾,这时候我对tail这个尾部指针是没有进行任何操做的,tail此时并无真正指向该列表的尾部。在这以后在调用removeLast()方法,就不能对尾部的节点进行正确的操做,会出现空指针的状况。

    java

  • 问题2:在完成pp6_17编程项目的过程当中,当我调用contains()方法来判断某节点是否存在时,我发现我明明删掉的节点在判断的时候依旧为true。

  • 问题2解决方法:令我奇怪的时,当我打印输出整个列表时,我已经删掉的这个节点是不会出现的,我调用Last()方法打印该列表的最后一个节点所保存的元素发现也是没有问题的。我又更换了几组节点进行判断是否存在,更让我奇怪的事情发生了,只有当判断的节点是最后一个而且该节点被删除时才会出现问题。我进行了debug操做,在判断到我所认为的列表的末尾时,它居然还会继续循环下去,指向那个我本来觉得删除的节点!我终于发现了问题所在,在删除末尾节点的时候虽然将tail指向了它前面的节点,但并未将tail指向空,因此在循环的时候指针依旧是指向那个本要删除的节点的。以下图所示,我只要把tail再指向null就好了。

    git

代码托管

上周考试错题总结

  • 错题1::A reference variable can refer to any object created from any class related to it by inheritance.
    A . true
    B . false
  • 错题分析:这题翻译过来就很直接明了了,子类经过继承父类可以调用父类的全部方法,在测试的时候对英语不是很懂什么意思,致使作错。
  • 错题2:A well-defined interface masks the implementation of the collection.
    A . true
    B . false
  • 错题分析:一个定义良好的接口可以更好的帮助集合的实现,测试时没有好好理解题目的意思。
  • 错题3:Common features should be located as low in a class hierarchy as is reasonable, minimizing maintenance efforts.
    A . true
    B . false
  • 错题分析:公共特征应该在合理的层次结构中尽量高,从而最大限度地减小维护工做。

结对及互评

  • 博客中值得学习的或问题:
    • 排版精美,对于问题研究得很细致,解答也很周全。
  • 代码中值得学习的或问题:
    • 代码写的很规范,思路很清晰,继续加油!

点评过的同窗博客和代码

其余(感悟、思考等,可选)

  不得不说,国庆七天假期内的学习效率是很是低的(不想学习!不想学习!不想学习!)。但仍是硬撑着完成了编程任务、写完了博客。也没有花更多的功夫去进行拓展学习。总的来讲,这七天的学习时间是不够的,但愿在假期过去后,本身的学习状态有所回升,继续进步!编程

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
第一周 200/200 1/1 5/20
第二周 981/1181 1/2 15/20
第三周 1694/2875 1/3 15/35
第四周 3129/6004 1/4 15/50
  • 计划学习时间:15小时数组

  • 实际学习时间:15小时网络

参考资料

相关文章
相关标签/搜索