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) |
返回列表中的元素数量 |
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::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小时网络
参考资料