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

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

教材学习内容总结

第十章

  • 串流设计的概念
  1. 无论来源和目的地实体形式是什么,只要取得InputStream和OutputStream实例后,就只是调用InputStream和OutputStream的相关方法。
  2. 如果要将数据写入目的地,可以使用输出串流。
  3. dump()方法
import java.io.*;

public class IO {
    public static void dump(InputStream src, OutputStream dest)
            throws IOException {
        try (InputStream input = src; OutputStream output = dest) {
            byte[] data = new byte[1024];
            int length;
            while ((length = input.read(data)) != -1) {
                output.write(data, 0, length);
            }
        }
    }
}
  • 将某个文档读入并另存为另一个文档:
import java.io.*;

public class Copy {
    public static void main(String[] args) throws IOException {
        IO.dump(
                new FileInputStream(args[0]),
                new FileOutputStream(args[1])
        );
    }
}
  • 从HTTP服务器读取某个网页,并另存为文档:
import java.io.*;
import java.net.URL;

public class Download {
    public static void main(String[] args) throws IOException {
        URL url = new URL(args[0]);
        InputStream src = url.openStream();
        OutputStream dest = new FileOutputStream(args[1]);
        IO.dump(src, dest);
    }
}
  • 串流继承结构
  • 将标准输入指定为FileInputStream,可以读取指定文档并显示在文本模式:
import java.io.*;
import java.util.*;

public class StandardIn {
    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream(args[0]));
        try (Scanner file = new Scanner(System.in)) {
            while (file.hasNextLine()) {
                System.out.println(file.nextLine());
            }
        }
    }
}
  • 串流处理装饰器
  1. BufferInputStream与BufferOutputStream会将数据尽量地读取或者写入到缓冲区,从而提高效率 -DataInputStream与DataOutputStream提供读取写入java基本类型的方法.
  2. ObjectInputStream与ObjectInputStream将数据读入或写出为对象.
  • Reader与Writer继承架构
  1. FileReader、FileWriter可以对文档作读取或写入,默认会使用操作系统默认编码。
  2. 抽象化了数据读入和写出的目的地,会将读入的数据植入char数组中.
  • 字符处理装饰器可以使用BufferReader和BufferWriter将数据进行缓冲,增加读取写入效率。

第十一章

  • 线程介绍

通过创建Thread实例来执行Runnable实例定义的run方法可以实现多个线程。

  • Thread和Runnable

继承Thread类也可以进行多个进程,但没有Runnable的弹性好,运用Lambda表达式也可以简化程序。

  • 线程生命周期
  1. Daemon:在所有的非Daemon线程结束时,JVM就会自动终止。
  2. sleep、wait阻断等都会让线程进入blocked状态,运用多线程,避免cpu空闲下来,是改进效能的方式之一。
  • ThreadGroup

用来管理群组中的线程,enumerate可以取得群组中的所有线程,activecount()用来取得线程的数量

  • synchronized和volatile
  1. 被表示为synchronized的区块会被监控(monitor),需要先取得指定对象锁定后才能执行,线程因synchronized区块而进入blocked,在取得锁定之后,会先回到runnable状态,不正确地使用synchronized可能会造成效能低落或者死结。
  2. volatile 变量上声明,表示该变量是不稳定的、易变的,并且不允许线程快取,保证单一变数的可见性。
  • 等待与通知

waitnotifynotifyAll

  • Lock、ReadWriteLock与Condition

如果两个方法都只是读取对象状态,并没有更改对象状态,只是读取操作的话,允许多个线程并行会对读取效率有所改善 ReadWriteLock接口就定义了读取锁定与写入锁定行为。

  • 使用Executor

Executor接口可以将Runnable的指定与实际如何执行分离.

  • Collection

CopyOnWriteArraySet操作set接口,使用于一个很少进行写入操作,而使用迭代器频繁的情境。

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

  • 问题:

对第十章各种输入输出的流及类的关系和差别弄不清楚。

  • 解决方案:

通过反复看教材并总结知识点,得到以下解析:

InputStream:字节输入流,抽象化字节数据读入的来源
OutputStream:字节输出流,抽象化字节数据写出的目的地

InputStream子类:FileInputStream、ByteArrayInputStream、DataInputStream、ObjectInputStream
OutputStream子类:FileOutputStream、ByteArrayOutputStream、DataOutputStream、ObjectOutputS
tream、PrintStream

Reader:字符输入流,抽象化字符数据读入的来源
Writer:字符输出流,抽象化字符数据写出的目的地

Reader子类:FileReader、BufferedReader、StringReader、CharArrayReader、InputStreamReader
Writer子类:FileWriter、BufferedWriter、StringWriter、CharArrayWriterr、OutputStreamWrit
er、PrintWriter

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

  • 问题:

不理解书上p327页代码片段(如下)中start的作用及含义。

Thread tortoiseThread = new Thread(tortoise);
Thread hareThread = new Thread(hare);
tortoiseThread.start();    
hareThread.start();
  • 解决过程:

通过看书上的重点内容,得到以下解释:

从main()开始的流程会由主线程执行,可以创建Thread实例来执行Runnable实例定义的run()方法,要启动线程
执行指定流程,必须调用Thread实例的start()方法。

最后运行成功,结果如图:
image

上周考试错题总结

  • 下列属于非受检异常的是哪项?

A.SQLException

B.IOException

C.NullPointerException

D.OutOfMemoryError

答案:D

  • 9.实现了set接口类是哪一项()

A. ArrayList

B. Hashset

C. HashTable

D. Collection

答案:B

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

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

每周的内容实在是太多了,每一周都有不会的东西积攒下在,到了第六周我实在受不了了,我决定这周开始天天晚上617看视频从头学,不然这么滚雪球的话,到了期末什么也没学会,白白浪费了时间。那真是讽刺意味十足。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 10/20 简单了解了jdk,认识了Java语言学习的复杂性
第二周 70/100 1/1 18/25
第三周 150/200 1/1 14/20
第四周 200/300 1/1 15/20
第五周 200/300 1/1 15/20
第六周 350/500 1/1 15/20

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:20小时

  • 实际学习时间:15小时

  • 改进情况:

提高了有限学习时间内的效率

参考资料

posted @ 2017-04-02 22:21  田宜楠20155304  阅读(236)  评论(5编辑  收藏  举报