20172325 2018-2019-1 《Java程序设计》第二周学习总结
教材学习内容总结
3.1集合
- 集合是一种聚集、组织了其他对象的对象。集合可以分为两大类:线性集合和非线性集合。
- 线性集合:一种其元素按照直线方式组织的集合。
- 非线性集合:一种其元素按某种非直线方式组织的集合。
- 集合中元素的彼此之间的组织形式通常由元素添加到集合的次序和元素自身的一些内在关系决定。
- 抽象数据类型(ADT):是一种在程序设计语言中尚未定义其值和操作的数据结构类型。ADT的抽象性体现在,ADT必须对实现细节进行定义,且这些对用户是不可见的。
- Java集合API(应用程序编程接口):一个类集,表示了一些特定类型的集合,这些类的实现方式各不相同。
3.2栈集合
- 栈(STACK)是一种线性集合,其元素的添加和删除都是在同一端进行的。其遵循后进先出(LIFO)原则,可颠倒顺序。
- 栈的基本操作
- 操作:描述
push:添加一个元素到栈的顶部
pop:从栈的顶部移出一个元素
peek:查看栈顶部的元素
isempty:确定栈是否为空
size:确定栈的元素数目
3.3主要的面向对象概念
- 利用多态引用和继承,可以创建可以储存任意类型的对象的集合。
- 多态引用是一个引用变量,他可以在不同地点引用不同类型的对象。术语“多态性”可定义为“具有多种形式”。通过多态引用调用的某个方法,在每次调用的时候都可以发生变化。
- 继承可用于创建一个类层次,一个引用变量可用于指向与之相关的任意对象。继承就是从已有类派生出一个新类的过程。新类自动地含有初始类的部分和全部变量和方法。
- 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
3.4使用栈计算后缀表达式
- 由栈提供的操作与后缀表达式计算过程有着很好的一致性。使用栈来计算后缀表达式的算法描述如下:从左到右扫描表达式,依次识别出每个符号(操作符或操作数)。如果是操作数,就将其压入(push)栈中。若是操作符,则从栈中弹出(pop)两个操作数,并把先弹出数放在符号右侧,后弹出数放在符号左侧进行计算,然后把计算结果压入(push)到栈中,循环往复,当进行到表达式的末尾时,栈中所剩余的元素便是该表达式的结果。
- javadoc注释(为Java添加注释的官方标准):以/**开始、以 */结束。Javadoc可用于创建关于类集的在线的HTML文档,在线的JavaAPI文档就是例子。
3.6栈ADT
- Java接口定义了一个抽象方法集,有助于把抽象数据类型的概念与其实现分开。
public interface stackADT <T>
3.7用数组实现栈
- 数组中的单元数量称为容量,该值储存在数组的length常量中,数组一旦创建好,其容量是不能改变的。
3.8ArrayStack类
- 泛型(包括泛型数组)不能被实例化。所以我们必须创建一个存储Object引用的数组,然后把他转换成泛型数组。
- 在将Object数组转换成泛型数组时一定会出现未检验类型转换警告,所以加上@SuppressWarnings(“unchecked”)即可。
- push、pop、peek、isempty、size等方法的具体使用。
4.1链接作为引用
- 对象引用变量可以用来创建链式结构,链式结构是一种数据结构
- 对象引用变量存放的是对象的地址,表示对象在内存中的存储位置
- 在链表中存储的对象通常泛称为该链表的结点,注:需要一个单独的引用变量来表示链表的首结点,链表终止于其next引用为空的结点
4.2管理链表
- 对于管理链表时,进行删除和插入的方式的顺序是很重要的,如果不当,会将出现某段结点消失的情况
改变引用顺序是维护链表的关键
4.3无链接的元素
- 存储在集合中的对象不应该含有基本数据结构的任何实现细节
4.4JavaAPI中的栈
- java.util.Stack类是从Vector派生而来的,它带给了栈一些不恰当的操作。
4.5使用栈来穿越迷宫
- 这一节是迷宫的类型。说明的是:可以用栈来模拟递归处理,以跟踪恰当的数据
教材学习中的问题和解决过程
- 问题1:在做选择排序和冒泡排序的时候对于冒泡排序法完全没了印象
- 问题1解决方案:
冒泡排序:
原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;
第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;
依次类推,每一趟比较次数-1; - 冒泡排序的思维是最简单的,但是代码实现起来并不是很容易。当时用循环来比较的时候,就一直要把链表的节点向后推,但要用一个中间变量temp来保存前面的数字,然后做数字交换,最后把遍历的起始节点重指向头结点。
- 由于细节比较或是循环问题,速度上体现为:插入排序>选择排序>冒泡排序,三种排序的比较:其时间复杂度都是O(n^2)。
代码调试中的问题和解决过程
问题1:在蓝墨云的作业中,有个要求是实现删除和插入的操作,但是最开始我没有注意到,结果就是
问题1解决方案:听同学说我做的少了很多东西,又重新增加了一些代码,实现了插入和删除结果是
代码托管
上周考试错题总结
- 理解情况:在做这道题的时候,我太过于钻牛角尖,我认为少了“或费极少的力”,于是错了,但是现在看来更加深了理解。
- 理解情况:软件工程,不是电气工程。
- 理解情况:书上的内容,没有认真看书。
- 理解情况:栈的操作是先进后出,颠倒了数据的顺序,故不能保存顺序。
- 理解情况:当时没有很理解书上关于增长函数的图表,后来理解之后发现O(2n)的函数增长最快。
- 理解情况:根据增长函数的图像可知。
结对及互评
- 博客中值得学习的或问题:
- 在教材和代码问题上很详细,同时很会找问题记录问题。
- 代码中值得学习的或问题:
- 代码操作并没有像我一样忘记很多
- 对代码的规范性也更加注意了
- 基于评分标准,我给本博客打分:9分。
- 20172306
其他(感悟、思考等,可选)
这周有了新的学习任务,开始慢慢找回原来的感觉,但是还是感觉忘了很多东西,着实花了不少功夫,还有因为学代会的召开,耽误的两节课程,我会抓紧时间找同学找老师问问题补回来。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 20/20 | |
第二周 | 941/8481 | 2/2 | 18/20 |
参考资料
Java学习笔记(第8版)
《Java学习笔记(第8版)》学习指导