20155228 2016-2017-2 《Java程序设计》第6周学习总结
教材学习内容总结
输入与输出
在Java中输入串流代表对象为java.io.InputStream实例,输出串流对象为java.io.OutputStream实例
System.in和System.out分别是InputStream和PrintStream的实例,分别代表标准输入和输出。SetIn()方法可以指定InputStream实例,重新指定标准输入来源。Setout()方法可以指定PrintStream实例,将结果输入到指定目的地。
FileInputStream是InputStream的子类,可以指定文件名创建实例,创建文档就开启和读取数据。FileOutputStream是OutputStream的子类,可以指定文件名创建实例,创建文档就开启和读取数据。
ByteArrayInputStream是InputStream的子类,可以指定byte数组创建实例,创建就可以作为数据源开始读取。ByteArrayOutputStream是OutputStream的子类,可以指定byte数组创建实例,创建就可以作为目的地写出数据。
打包器类本身没有改变InputStream、OutputStream的行为,在取得数据后做加工处理,所以又称为装饰器。BufferedInputStream和BufferedOutStream可以提高读写效率。DataInputStream和DataOutputStream可以将方法在指定的类型和字节之间进行转换。ObjectInputStream和ObjectOutputStream可以将内存中的对象整个存储下来,之后再读入还原为对象。
java.io.Reader类和java.io.Writer类抽象化了字符数据的读入来源和写出目的地。InputStreamReader和OutputStreamWriter可以将字节数据装换为对应的编码字符。BufferedReader和BufferedWriter可以提高输入输出效率。
线程与并行API
在Java中,如果想在main()以外独立设置流程,可以撰写类操作java.lang.Runnable接口流程的,流程的进入点是操作在run()的方法中。
除了将流程定义在Runnable()的run()方法中之外,另一个撰写多线程程序的方式就是继承Treead类,重新定义run()方法。在java中,任何线程可执行的流程都要定义在Runnable()的run()方法中。
主线程会从main()方法开始执行,直到main()方法结束后停止JVM。如果一个被标识为Deamon线程,在所有的非Deamon线程都结束时,JVM自动会终止。使用isDaemon()方法可以判断线程是否为Daemon线程。
在调用Thread实例start()方法后,基本状态为可执行、被阻断、执行中。实例化Thread并执行start()之后线程进入Runnable状态,必须等待排班器排入*处理器执行,线程才会执行run()方法。线程具有优先权,可以使用Thread的setPriotity()方法设定优先权,数字越大,优先权越高。使用thread.sleep()会让线程进入blocked状态,若此时有其他线程调用该线程的interrupt()方法会抛出InterruputException异常对象。可以使用join()方法使一个线程正在运行,流程中允许另一个线程加入,等到另一个线程执行完毕后再继续第一个线程,join()方法可以指定时间。如果要停止线程最好自行操作,让线程跑完应有的流程,而非调用方法。
每个线程都属于某个线程组群。若在main()主流程中,产生一个线程该线程会属于main()线程组群。每个线程产生时,都会归入某个线程组群。如果没有指定,就归入产生该线程的线程的组群,也可以自行指定线程组群。
每个对象都会有个内部锁定,或称为监控锁定。被synchronized标示的区块,将会被监视,任何线程要执行synchronized区块都必须先取得指定的对象锁定。线程在等待对象锁定时,会进入被锁定状态。在取得锁定之后,会先回到可执行状态,等待*处理器排班器,排入执行中状态。
可以在变量上声明volatile,表示变量是不稳定,易变的,也就是可能在多线程下存取。这保证变量的可见性,也就是若有线程变动了变量值,另一线程一定可以看到变更。
执行synchronized范围的程序代码期间,若调用锁定对象的wait()方法。线程会释放对象锁定并进入对象等待集合,而处于阻断状态。其他县城可以竞争对象锁定。取得锁定的线程可以执行synchronized范围的程序代码。
被竞争锁定的对象调用notify()时,会从对象等待集合中随机通知一个线程加入排班,再次执行前被通知的线程会与其他线程共同竞争对象锁定。如果调用所有等待集合中的线程都会被通知参与排班。这些线程会与其线程共同竞争对象锁定。
教材学习中的问题和解决过程
教材第322页课后练习题第五题:正确答案是A选项。根据题目的题干,我们可以知道新建对象实例是用来读入与写出字节数据的,而在题目的四个选项中,除了第一个选项之外其他选项都是用来读入和写出字符数据的。
关于装饰器的作用
装饰器的名称 | 装饰器的作用 |
---|---|
BufferedInputStream | 提高读写效率 |
BufferedInputStream | 提高读写效率 |
DataInputStream | 修饰方法中提供的基本数据类型,使得这些方法会自动在指定的类型与字节间转换 |
DataOutputStream | 修饰方法中提供的基本数据类型,使得这些方法会自动在指定的类型与字节间转换 |
ObjectInputStream | 将内存中的对象整个存储下来,之后再读入还原为对象。 |
ObjectOutputStream | 将内存中的对象整个存储下来,之后再读入还原为对象。 |
代码调试中的问题和解决过程
- 关于新建一个文本文件的写入和读取数据的问题。在代码第24行的地方,那个true的参数,代表如果这个文件已经存在了,就把新的内容添加到该文件的最后。如果想重新创建新文件,把true改成false即可。
代码托管
上周考试错题总结
“Hello”.charAt(1) 的值是(‘e’)
System.out.println( “HELLO”.( toLowerCase() ) ) 会输出“hello”..“Hello”.substring( 0,2 )的值是“He”
CH06填空:在构造方法中调用本类的构造方法,要使用(this)关键字
CH06填空:在构造方法中调用父类的构造方法,要使用(super)关键字
-
CH07 填空:面向对象中,设计经验可以用(设计模式)表达
结对及互评
评分标准
- 正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
- 模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
- 本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
- 其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
- 扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
- 博客中值得学习的或问题:
- 代码中值得学习的或问题:
点评过的同学博客和代码
本周结对学习情况
结对学习内容
在调用Thread实例start()方法后,基本状态为可执行、被阻断、执行中。实例化Thread并执行start()之后线程进入Runnable状态,必须等待排班器排入*处理器执行,线程才会执行run()方法。线程具有优先权,可以使用Thread的setPriotity()方法设定优先权,数字越大,优先权越高。使用thread.sleep()会让线程进入blocked状态,若此时有其他线程调用该线程的interrupt()方法会抛出InterruputException异常对象。可以使用join()方法使一个线程正在运行,流程中允许另一个线程加入,等到另一个线程执行完毕后再继续第一个线程,join()方法可以指定时间。如果要停止线程最好自行操作,让线程跑完应有的流程,而非调用方法。
每个线程都属于某个线程组群。若在main()主流程中,产生一个线程该线程会属于main()线程组群。每个线程产生时,都会归入某个线程组群。如果没有指定,就归入产生该线程的线程的组群,也可以自行指定线程组群。
每个对象都会有个内部锁定,或称为监控锁定。被synchronized标示的区块,将会被监视,任何线程要执行synchronized区块都必须先取得指定的对象锁定。线程在等待对象锁定时,会进入被锁定状态。在取得锁定之后,会先回到可执行状态,等待*处理器排班器,排入执行中状态。
上周博客互评情况
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 10/10 | 1/4 | 12/12 | |
第二周 | 120/130 | 1/5 | 9/21 | |
第三周 | 210/340 | 1/6 | 9/30 | |
第四周 | 460/800 | 1/7 | 9/39 | |
第五周 | 400/1200 | 1/8 | 9/48 | |
第六周 | 300/1500 | 1/9 | 9/57 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:9小时
实际学习时间:9小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)