20155303 2016-2017-2 《Java程序设计》第六周学习总结

课堂笔记

  • 高效学习法推荐

看视频学习(2h)→ 以代码为中心看课本,思考运行结果并验证(3h)→ 课后作业验证(5h)→ 教材指导

【充分利用教材指导,积极思考遇到的问题,在实践中学习,不要拘泥于记忆教材讲解的知识点和概念。】

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

  • 『问题一』:以课本P306为例,args[0]args[1]代表什么?

『问题一解决』:java的主方法为:public static void main(String [] args)args[0]表示命令行输入时传的第一个参数,args[1]同理。例如执行以下程序:

运行java WhatIsArgs No1 No2命令可得到结果:No1No2

  • 『问题二』hasNextLine()nextLine()的用法?

『问题二解决』:查询API文档可知,hasNextLine()nextLine()均继承自java.util.Scanner。它们的用法是,hasNextLine()用来判断下一行是否存在,常用在while语句中,当且仅当下一行有输入时返回true;而nextLine()返回值是当前行的剩余内容。

两者具体使用方法可参考以下代码:

  • 『问题三』:课本P316提到“如果在做对象串行化时,对象中某些数据成员不希望被写出,则可以标上transient关键字”一句该如何理解?

『问题三解决』:一个对象只要实现了Serilizable接口,这个对象就可以被序列化,不过有些时候,一个类的有些属性需要序列化,而其他属性不需要被序列化。java的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

比如以下程序:

在上面的例子中,将属性b前添加关键字transient,虽然我们序列化的对象b的属性值为“Transient or not”,但是当我们反序列化之后发现这个属性为空,说明这个属性没有进行序列化。

【关于什么是序列化,参考博客深入理解Java对象序列化

  • 『问题四』:守护线程与非守护线程

『问题四解决』:简单来说,java可以创建两种线程,即守护线程与非守护线程。非守护线程(User Thread用户线程)就是平时创建的一般线程,而守护线程(Daemon Thread守护线程)是用来服务用户线程的。

区分守护线程与非守护线程:当线程只剩下守护线程的时候,JVM就会退出.但是如果还有其他的任意一个用户线程还在,JVM就不会退出。

setDaemon()与isDaemon()setDaemon方法用来设定一个线程。如果setDaemon(true)表示设定一个线程为Daemon线程。isDaemon则用来测试一个线程是否为守护线程。如果是,返回true。

  • 『问题五』:Thread常用方法以及状态图

『问题五解决』

常用方法:

start(); //启动线程

getId(); //获得线程ID

getName(); //获得线程名字

getPriority(); //获得优先权

isAlive(); //判断线程是否活动

isDaemon(); //判断是否守护线程

getState(); //获得线程状态

sleep(long mill); //休眠线程

join(); //等待线程结束

yield(); //放弃cpu使用权利

interrupt(); //中断线程

currentThread(); //获得正在执行的线程对象

Thread状态图:

  • 『问题六』:对于课本P334join()的介绍产生疑问:Thread B 什么时候加入主线程呢?是不是从join()方法出现的位置开始呢?

『问题六解决』:在不同位置调用join()方法,程序如下:

“尝试一”运行结果:

“尝试二”运行结果:

可以看出,程序启动后主线程就开始了,调用join()之后把Thread B加入主线程流程中,执行完毕后再继续执行原本的线程。

注:可以在join()指定时间,如join(1000)表示让加入的线程执行1000毫秒,也就是1秒。1秒结束后线程可以继续执行原本流程。

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

本周跟视频学习的过程中思考一个问题:字节流和字符流的优势各在哪里呢?使用哪一个比较好呢?

答案是字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输和保存的,包括图片,mp3等等。但是字符只是在内存中才会形成,所以在开发过程中,字节流使用更加广泛。

下面通过几个例子总结了字节流的应用情况。

  • 『问题一』:向文件中写入字符串

运行以下程序:

查看hello.txt会看到“你好”:

也可以向文件中一个字节一个字节地写入字符串,运行结果同上:

  • 『问题二』:向文件中追加新内容

运行以下程序:

查看hello.txt会看到“你好DiWeijia”:

  • 『问题三』:读取文件内容

运行以下程序,可以读出hello.txt里的内容:

知识拓展

谢涛老师在之前的一篇博客中提出问题:如何把一个Java源文件里的注释去掉(处理结果可以输出到新的文件里),保证修改后源文件仍然能正常编译,正确运行。得到娄老师的指点之后,明白这个问题的解决需要用到正则表达式

正则表通常被用来检索、替换那些符合某个模式(规则)的文本。我们经常使用Windows/Dos下用于文件查找的通配符(wildcard),也就是* 和?。如果想查找某个目录下所有的word文档,我们会搜索 * .doc。在这里,* 会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求。

比如要求填写5-12位的QQ号,就可以使用正则表达式:\d{5,12}$。表示匹配字符串的开始,$表示匹配字符串的结束,\d表示匹配数字,{5,12}表示数字为5-12位。这样一来,如果用户输入能匹配这个表达式的话,就符合要求了。

像以上的“^”、“$”等都是正则表达式的元字符。元字符以及常用的正则表达式如下:(参考娄老师博客正则表达式入门

“去注释”问题可以利用正则表达式的相关知识,结合之前学到的“转义符”解决。基本思路是:对待分析的带注释段的字符串进行遍历,声明一个缓冲字符串变量来记录非注释的部分,最后返回这个缓冲字符串变量作为结果。这样就能把去除注释之后的文件保存下来了。可以从以下四个方面考虑:

1.考虑双引号:双引号中的注释部分是不能去掉的,比如print("//Hello"World"/ * comment * /")。以下几条都应在没有双引号的前提下。如果发现了开始双引号,在匹配结束双引号的时候要注意可能会遇到转义双引号,需要跳过以\开始的双引号,从而匹配到正确的结束双引号;

2.考虑 / * comment * / 形式的注释 :当遇到 / * 部分便停止记录,继续往后遍历到 * / 部分,实现跳过 / * * / 段;

3.考虑/ * comment / * inside * / out * /形式的嵌套注释:声明一个数字变量来记录 / * 的开始的次数,遇到一个 / * 就+1,遇到一个 * / 就-1,实现嵌套匹配;

【注意】:注释不能嵌套:/ * / * inside * / * /,所以这种情况不予考虑。感谢谢涛老师的指正:)

4.考虑双斜杠注释 发现 // 形式的字符串的时候表明遇到了双斜杠注释,这时候使用while循环继续向后遍历,直到发现一个换行符,从而跳过整个这一行;

正则表达式的应用领域非常广,以上提到的这些只是一点皮毛。要想熟练掌握正则表达式的用法,还需要多动手多实践。

代码托管

上周考试错题总结

  • 『问题一』

现有:

- list是一个合法的集合引用

- getCollection()返回一个合法集合的引用

哪个是合法的?

A.or(Object o ; list)

√B.for(Object o : getCollection())

C.for(Object o : list.iterator())

D.for(lterator i ; list.iterator() ; i.hasNext () )

√E.for(lterator i=list.iterator(); i.hasNext (); )

  • 『考点』

B选项是增强式for循环。增强式for循环能对数组和集合进行遍历,使用上更加简洁。D选项是普通循环,i操作了iterator()接口,如果没有抛出异常,则i.hasNext()返回值为true。

  • 『问题二』

Which of the following methods will not compile? :

A.

private void method1(String name) {
if (name.equals("star"))
throw new IllegalArgumentException(name);
}

√B.

private void method2(int age) {
if (age > 30)
throw Exception();
}

C.

public double method5() throws Exception {
return 0.7;
}

√D.

protected double method4() throws Exception {
throw new Throwable();
}
  • 『考点』

B选项无法编译,因为Exception是受检异常,必须使用throws声明此方法会抛出的异常类型或父类型。D选项无法编译,因为子类不能抛出比父类更一般的异常。

  • 『问题三』

What is the output of the following code?

class EJava {
void method() {
try {
guru();
return;
} finally {
System.out.println("finally 1");
}
}
void guru() {
System.out.println("guru");
throw new StackOverflowError();
}
public static void main(String args[]) {
EJava var = new EJava();
var.method();
}
}

A.guru

finally 1

√B.guru

finally 1

Exception in thread "main" java.lang.StackOverflowError

C.guru

Exception in thread "main" java.lang.StackOverflowError

D.guru

E.The code fails to compile.

  • 『考点』

首先程序可以通过编译。其次,StackOverflowError()是非受检异常,方法guru()在try-catch块中,异常会被捕捉。由于guru()本身没有处理堆栈溢出错误,但method()定义了finally区块,所以程序在执行完毕finally区块之后将错误传播至JVM,中断程序。

结对及互评

本周结对学习情况

  • 结对同学学号20145202马超

  • 结对学习内容:查看对方代码,并对学习中遇到的疑问进行交流。解答对方博客中未解决的问题。

第六周博客互评情况

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

  • 1、最近几周的学习内容系统性和连贯性很强,所以要经常查询API文档,了解常用的类和方法以及其继承架构。

  • 2、学习过程中应该把思考作为重中之重,这一点之前就领悟到了,不过在实践之中经常被忽略。所以我们不应该单纯地把代码行数看做衡量自己学习情况的标准,理解得透彻了才能达到举一反三的效果。按照这种方法学习不仅可以深刻理解所学知识,也提高了学习效率,减轻了学习负担。

  • 3、不学则已,一学即专。心不能静下来的时候宁可不看书。万万不可一边打着学习的名义捧书研读,一边还在为其他事困扰,这样只能欺骗自己“我真的学习了”,却仅仅是耗费时间,而达不到理想的效果。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 16/16 1/1 18/18 初步认识了Java
第二周 219/235 1/2 28/46 学习了Java的基本语法知识
第三周 766/1001 1/3 23/69 了解对象与参考的关系,以及封装的概念与实现
第四周 984/1985 1/4 18/87 学习了继承与多态的关系,以及接口的多态操作
第五周 866/2851 1/5 12/99 学习了异常处理,学会使用Collection收集对象
第六周 664/3515 1/6 15/114 认识字节流和字符流的继承架构,学习线程与并行API

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:20小时

  • 实际学习时间:15小时

  • 改进情况:这周的效率跟之前比有了很大的提高,我想应该归功于娄老师上节课提到的学习方法。以后的学习应该抓住重点,多思考,不要把时间浪费在照搬书上的代码之类的无用功上。

(有空多看看现代软件工程 课件

软件工程师能力自我评价表
)

参考资料

20155303 2016-2017-2 《Java程序设计》第六周学习总结的更多相关文章

  1. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  2. 20155303 2016-2017-2 《Java程序设计》第九周学习总结

    20155303 2016-2017-2 <Java程序设计>第九周学习总结 目录 学习内容总结(Linux命令) 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...

  3. 20155303 2016-2017-2 《Java程序设计》第一周学习总结

    20155303 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 浏览教材,根据自己的理解每章提出一个问题 Chapter1 Java平台概论:MyProgr ...

  4. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  5. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  6. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  7. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  8. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  9. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

  10. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

随机推荐

  1. MiniNet自定义拓扑

    SDN 与 Mininet 概述 SDN 全名为(Software Defined Network)即软件定义网络,是现互联网中一种新型的网络创新架构,其核心技术 OpenFlow 通过网络设备控制面 ...

  2. 百度Hr分享,一个合格的数据工程师简历中必备技能?

    如果你是一名数据科学方面的求职者,你肯定想知道在简历上写些什么才能获得面试的机会:如果你想进入这个领域,你一定想知道具备哪些技术才能成为一名有竞争力的求职者. 在本文中,我们对Indeed中一千份数据 ...

  3. Git多人协作工作流程

    前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...

  4. About The Algorithm Simplification

    For mode 1, you have to ergod all the data in the files. So the key point to solve this problem is t ...

  5. SDN可靠性相关

    A subtree-based approach to failure detection and protection for multicast in SDN FRONTIERS OF INFOR ...

  6. Spherical Hashing,球哈希

    1. Introduction 在传统的LSH.SSH.PCA-ITQ等哈希算法中,本质都是利用超平面对数据点进行划分,但是在D维空间中,至少需要D+1个超平面才能形成一个封闭.紧凑的区域.而球哈希方 ...

  7. _stdcall 和 _cdecl

    今天遇到一个问题用C++编写一个动态链接库生成的文件为dll.dll,用在visual stdio 2010调用这个dll 调用形式:[DllImport("dll.dll")] ...

  8. final阶段140字评论

    按课堂顺序 1约跑APP ,无论从页面还是从功能来看完整度都很高了.演示也用了能展示的方式.多些趣味性就更赞了. 2礼物挑选小工具,做了能在规定时间内的功能.也算是对礼物固话的一个成本最低的回应. 3 ...

  9. 各组Beta版本发布点评

    1.  新蜂:俄罗斯方块 俄罗斯方块已经基本完成了所有功能,运行流畅,也加入了之前用户期待的即将降落的方块和游戏积分的功能,用户还能随时暂停和继续游戏. 2. 天天向上: 连连看游戏 连连看游戏在核心 ...

  10. vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等)

    我们将vmwear虚拟机导出ovf模板后,有三个文件: 1,.mf 保存着.ovf和.vmdk两个文件的SHA1值,用于校验文件的完整性 2,.ovf 以XML格式保存着虚拟机的配置信息 3,.vmd ...