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

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

学习目标

  • 理解流与IO
  • 理解InputStream/OutPutStream的继承架构
  • 理解Reader/Writer继承架构
  • 会使用装饰类
  • 会使用多线程进行并发程序设计

教材学习内容总结

本周主要进行第十章和第十一章的学习。

第十章

  • Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。

  • 从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流(java.io.InputStream 实例),如果要将数据写入目的地,可以使用输出串流(java.io.OutputStream 实例)

  • 在不使用InputStream与OutputStream时,必须使用close()方法关闭串流。由于InputStream与OutputStrem操作了java.io.Closeable接口,其父接口为java.lang.AutoCloseable接口。

  • InputStream、OutStream提供串流基本操作,如果想要为输入/输出的数据做加工处理,则可以使用打包器类。常用的打包器具备缓冲区作用的BufferedOutputStream、BufferedInputStream,具备数据转换处理的DataInputStream、DataOutputStream,具备对象串行化能力的ObjectInputStream、ObjectOutputStream等。

  • 装饰器为输入/输出的数据做处理,例如缓冲、串行化、数据装换等。

  • printWriter与PrintStream处理可以对OutputStream打包之外,Printwriter还可以对writer进行打包,提供print()、println()、format()等方法。

import java.io.IOException;
import static java.lang.System.out;

public class MemberDemo {
    public static void main(String[] args) throws IOException {
        Member[] members = {
                    new Member("B1234", "Justin", 90), 
                    new Member("B5678", "Monica", 95), 
                    new Member("B9876", "Irene", 88)
        };
        for(Member member : members) {
            member.save();
        }
        out.println(Member.load("B1234"));
        out.println(Member.load("B5678"));
        out.println(Member.load("B9876"));
    }
}
  • Reader、Writer也有一些装饰器类可供使用,如果串流处理的字节数据,实际上代表某些字符的编码数据,而你想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader和OutputStreamWriter

  • 解析几个常用子类: StringReader可以将字符串打包,当做读取来源,StringWriter可以作为写入目的地,最后toString()取出所有写入的字符组成的字符串。CharArrayReader、CharArrayWriter类似,将char数组当做读取来源以及写入目的地。

  • 如果处理串流字节数据,将这些字节数据转换为对应的编码制度,可以使用 InputStringReader、InputStringWriter打包。

第十一章

  • 如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中。

  • 如果想要加装主线程,就要创建 Thread 实例,要启动额外的主线程就是调用 Thread 实例的 start() 方法。

  • 主线程会从main()方法开始执行,直到main()方法结束后停滞JVM。如果主线程中启动了额外线程,默认会等待被启动的所有线程都执行完run()方法才终止JVM。如果一个Thead被表示为Daemon线程,在所有的非Daemon线程都结束时,JVM自动就会终止。

  • Thread基本状态图:优先权高的先执行,否则输流执行。start——>runnable——>(blocked)——>running——>dead

  • 安插线程:当线程使用join()加入至另一个线程时,另一个线程会等待被加入的线程工作完毕,然后在继续它的动作,join()的意思表示将线程加入称为另一个线程的流程中。

  • 停止线程:线程完成run()方法后,就会进入Dead,进入Dead的线程不可以再次调用start()方法,否则会抛出IllegalThreadStateException异常。
    import java.util.Arrays;

public class ArrayList {
    private Object[] list;
    private int next;
   
    public ArrayList(int capacity) {
        list = new Object[capacity];
    }

    public ArrayList() {
        this(16);
    }

    public void add(Object o) {
        if(next == list.length) {
            list = Arrays.copyOf(list, list.length * 2);
        }
        list[next++] = o;
    }
    
    public Object get(int index) {
        return list[index];
    }
    
    public int size() {
        return next;
    }
}
  • CopyOnWriteArraySet操作了List接口,这个类的实例在写入操作时,内部会建立新数组,并复制原有数组索引的参考,然后在新数组上进行写入操作,写入完成后,再将内部原参考旧数组的变量参考至新数组.

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

  • 一、标准输入输出:
  • 解决方案:
    1.System.in: 标准输入,默认关联到键盘(终端输入)
    2.System.out: 标准输出,默认关联到显示器(终端输出)
    3.System.err: 标准错误,默认关联到显示器(终端输出)
    4.输入输出重定向:setIn,setOut,setErr
  • 二、线程控制的一些方法:
  • 解决方案:
    1.interrupt
    2.sleep
    3.join
    4.stop(Deprecated)
    5.resume(Deprecated)
    6.suspend(Deprecated)
    7.destroy(Deprecated)
    8.线程的停止、暂停、重启要程序员设定实现条件或使用并发API,不要调用Deprecated的方法
    9.同步:synchronized与volatile 2)方法上;2)代码段上;
    10.wait、notify、notifyAll

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

  • 一、课本P326的Tortoise程序中直接使用Runnable接口会报错
public class Tortoise implements Runnable {

private int totalStep;

private int step;

public Tortoise(int totalStep) {

this.totalStep=totalStep;

}
  • 二、在学习p343时,不正确的使用synchronized会出现“死结”
  • 为了避免Lock对象的lock方法后,在后续执行流程中抛出异常而无法解除锁定,一定要在finally中调用Lock对象的unlock方法。

代码托管

(statistics.sh脚本的运行结果截图)
1071472-20170402203800289-514124364.png

上周考试错题总结

  • 现有:1. import java.util.*;
    2.
    1. Class FindStuff {
      4.public static void main (String[]args) {
    2. //insert code here
      6. c.put ("X", 123);
      7. }
    3. }
      分别插入到第5行,哪几行允许代码编译?(BDF)
      A .
      Map c= new SortedMap();
      B .
      HashMap c= new HashMap();
      C .
      HashMap c= new Hashtable();
      D .
      SortedMap c= new TreeMap();
      E .
      ArrayList c= new ArrayList();
      F .
      Map c = new LinkedHashMap();
  • 现有:
    • list是一个合法的集合引用
    • getCollection()返回一个合法集合的引用
      哪个是合法的?(BE)
      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 (); )

结对及互评

评分标准

  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

  • 参考示例

点评过的同学博客和代码

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

本周内容较多,通过练习实际操作中的代码编写过程,发现很多东西在书上学不到,以后更应该增强实际应用。我认为老师说的方法有道理,可以先快速的把书看一遍,再通过视频的学习逐步加深,真正编写代码的时候有不会的地方回头查书。

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行20篇200小时
第一周8/101/48/10编写第一个Java程序HelloWorld
第二周79/891/511/21学习Java基础语法
第三周249/3381/616/37学习Java关于对象的重要知识
第四周331/6691/717/54学习Java关于继承、接口与多态的重要知识
第五周507/11761/818/72学习Java的异常处理、Collection与Map
第六周1321/24971/916/88学习Java的输入、输出与线性、并行API

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

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

  • 计划学习时间:20小时

  • 实际学习时间:16小时

  • 改进情况:学习时间跟上周差不多,但这周其他课的实验特多,所以还是有所进步的。

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

转载于:https://www.cnblogs.com/l20155233/p/6659608.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值