20172328 2018-2019《Java软件结构与数据结构》第四周学习总结
概述 Generalization
本周学习了第六章·列表,主要让我们认识列表以及分析各种列表实现。
教材学习内容总结 A summary of textbook
6.1列表集合
列表集合是一种概念性表示法,其思想是使事物以线性列表的方式进行组织。列表也可以用链表或者数组实现,列表集合没有内在的容量大小,它可以随着需要而增大。
-
列表集合有三种类型:
- 有序列表(ordered list):其元素按照元素的某种内在特性进行排序。
- 无序列表(unordered list):其元素间不具有内在顺序,元素按照它们在列表中的位置进行排序。
- 索引列表(indexed list):其元素可以用数字索引来引用。
6.2Java集合API中的列表
在JavaAPI中的ArrayList类和LinkedList类是由不同的底层结构实现的列表。
ArrayList类和LinkedList类都实现了java.util.List接口。List接口中的一些方法如图所示:
6.3使用无序列表:学习计划
Course类代表学生可能选的一门课程,ProgramOfStudy类代表一个学习项目,一个学生计划学习的一系列课程,POSTester类示运用列表来管理一些对象。
ProgramOfStudy类和Course类实现了Serializable接口,为了是某个对象能使用串行化进行存储,其类必须实现Serializable。在Serializable接口中没有任何方法,它只是表明,该对象可以转化为串行化表示形式。(在教材问题中再深入讨论)
6.4索引列表使用示例:Josephus问题
Josephus问题着眼于,当列表中的事件不是按顺序取出而是每隔i个元素提取,知道一个不剩时,如何找到这些事件的顺序。
关键代码实现:
6.5列表ADT
有序列表的接口和无序列表的接口可以使用继承ListADT接口中的通用方法并各自保留自己的特殊操作。
6.6使用数组实现列表
基于数组的列表实现能把列表的一端固定在索引0处,并可以按需要平移元素。
教材学习中的问题和解决过程 Problem and countermeasure
- 1.在书本第97页讲到了
ProgramOfStudy类和Course类都实现了Serializable接口为的是某个对象能使用串行化进行存储,该类必须实现Serializable接口。Serializable接口中没有任何方法,只是表明该对象可以转换为串行化表示形式。
对串行化表示形式不太懂。
问题1的解答:对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。
我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。
串行化的主要任务是写出对象实例变量的数值。如果变量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。
推荐资料:Java对象的串行化
2.在看用数组实现列表和做pp6.8的时候一直在想想想,modCount变量究竟是什么?为什么在列表中删除元素modCount也要增加?
问题2的解答:modCount变量是一个整数变量,一旦集合被修改(无论是增加、删除、插入),modCount就会增加。
3.在学习ProgramOfStudy类的代码时,对替代方法replace中的一行代码,该代码为
if(targetIndex!=-1)
不理解,虽然隐约猜到了是当目标元素索引值不返回-1,即目标索引值存在的话就进行list.set(targetIndex,newCourse)
代替操作,但还是不太理解数字-1的含义。问题3的解答:
public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
课后习题作答 Exercise
- 1.在做pp6.8,pp6.9,pp6.10的时候ArrayList类中的rear初始值为0,但是在remove方法中却有
rear--;
,这样rear不就成负数了嘛。不明白为什么不把rear的初始值定为list.length-1
- 习题1的解答:这个问题询问了王文彬同学,通过他的解答,我最终的理解是:ArrayList是一个基于数组实现的列表,在其中的方法只代表要进行的操作,在ArrayList中把rear初始化成0,但是当我们创建对象,调用方法函数的时候,对象列表的有效长度-1(即列表最后一个有效元素的索引值)才是rear此时的值。
- 2.不理解代码中的instanceof究竟是什么?这位置肯定是运算符啊。
if (!(element instanceof Comparable))
{
throw new NonComparableElementException("LinkedList");
}
习题2的解答:instanceof运算符用于识别正在处理的对象的类型,要求开发者明确地确认对象为某特定类型,即上述代码语句段意为“元素如果不是Comparable类型,则抛出一个NonComparableElementException("LinkedList")的异常”。
3.在运行测试类LinkedListTest时,突然出现了contains方法报错,之前写的代码如下:
习题3解决:经过改正后发现我的while循环做的是判断,没有让其遍历链表,而且我的返回值有点问题,改正后如下【贴图】
上周测试活动错题改正 Correction
- 问题1:A polymorphic reference can refer to different types of objects over time.(多态引用可以在一段时间内引用不同类型的对象)
A .true
B .false - 问题1解答:选择A,多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
- 问题2:A reference variable can refer to any object created from any class related to it by inheritance.(引用变量可以引用任何与它相关的类通过继承而创建的对象)
A .true
B .false - 问题2解答:选择A。引用变量是可以做到的,之前没有弄清楚。
- 问题3:Inheritance creates an is-a relationship between all parent and child classes.(继承创建了在所有父类与子类之间的is-a关系)
A .true
B .false - 问题3解答:选择A.上学期课本上有。
- 问题4:Common features should be located as low in a class hierarchy as is reasonable, minimizing maintenance efforts.
A .true
B .false - 问题4解答:选择B,最小化维护工作应该是表述不当的,因为共同特性定义在更低层次的话能够更多的被复用。
- 问题5:A linked list has no set capacity limitations other than the size of the computers memory(一个链表除了计算机内存的大小之外没有设置容量限制)
A .true
B .false - 问题5解答:选择A,这道题确实是自己不会做,瞎蒙的也蒙错了,链表原来可以这么随意的扩展啊。
- 问题6:A data structure is the underlying programming construct used to implement a collection.(数据结构是用于实现集合的底层编程结构)
A .true
B .false - 问题6解决:选择A。程序 = 数据结构+算法;
软件=程序+软件工程;所以说数据结构是用于实现集合的底层编程结构。
码云链接
代码量(截图)
结对及互评Group Estimate
-20172301的博客(点击进入)
-20172304的博客(点击进入)
点评模板:
- 博客中值得学习的或问题:
- 20172301:对于instanceOf理解的比较透彻,但是美中不足的是博客变简单了。我想应该是国庆让我们有点懈怠了吧。好在列表之前有过接触,继续加油!
- 20172304:教材问题和代码调试中的问题和解决过程都比较简单,解答可以写的再详细一点呀!太久的假期让我们无心学习啊哈哈哈。
其他(感悟、思考等,可选)Else
最难解决的问题是没有问题。
The most difficult problem toward a man is that he has no problem.
学习进度条Learning List
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 0/0 | 1/1 | 8/8 |
第二周 | 621/621 | 1/2 | 12/20 |
第三周 | 678/1299 | 1/3 | 10/30 |
第四周 | 2734/4033 | 1/4 | 20/50 |
参考资料Reference
- [Java软件结构与数据结构](第四版)
- Java对象的串行化
- JavaScript instanceof 运算符深入剖析
- 理解多态