zoukankan      html  css  js  c++  java
  • 20155334 2016-2017-2 《Java程序设计》第六周学习总结

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

    教材学习内容总结

    第十章:输入/输出

    InputStream与OutputStream

    • java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。
    • 从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流,如果要将数据写入目的地,可以使用输出串流。
    • 在JAVA中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream 实例。
    • 通用的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);
                }
            }
        }
    }
    
    10.1.2串流继承架构
    • System.in:文本模式下取得整行用户输入。可以使用SystemsetIn()方法指定InputStream实例,重新指定标准输入来源。System.outPrintStream实例。使用setOut()方法指定 PrintStream实例,将结果输出至指定的目的地
    • System.errPrintStream实例,称为标准错误输出串流,用来立即显示错误信息。
    • 使用System.setErr()指定PrintStream重新指定标准错误输出串流。
    • FileInputStreamInputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可用来读取数据,主要操作InputStreamread()抽象方法,使之可以从文档中读取数据。
    • FileOutputStream可以指定文件名创建实例,一旦创建文档就开启,接着就可用来写出数据,主要操作InputStreamwrite()抽象方法,使之可以写出数据至文档。
    • ByteArrayInputStreamInputStream的子类,可以指定byte数组创建实例,一旦创建就可将 byte 数组当作数据源进行读取。主要操作了InputStreamread()抽象方法,使之可从byte数组中读取数据。
    • ByteArrayOutputStreamOutputStream的子类可以指定byte数组创建实例,一旦创建就可将byte数组当作目的地写出数据。主要操作了OutputStreamwrite()抽象方法,使之可写出数据至byte数组。
    10.1.3串流处理装饰器
    • BufferedInputStreamBufferedOutputStream主要在内部提供缓冲区功能。

    • BufferedInputStreamBufferedOutputStream主要在内部提供缓冲区功能。

    • DataInputStreamDataOutputStrea用来装饰InputStreamOutputStreamDataInputStreamDataOutputStream 提供读取、写入java基本数据类型的方法,像是s读写int double
      boolean等的方法。这些方法会自动在指定的类型与字节间转换。

    10.2 字符处理类
    10.2.1 Reader与Writer 继承架构
    • 针对字符数据的读取,Java SE 提供了 java.io.Reader 类,其抽象化了字符数据读入的来源。针对字符数据的写入,Java SE 提供了 java.io.Writer 类,其抽象化了数据写出的目的地。
    • 如果从来源读入字符数据、将字符数据写至目的地,可以使用 CharUtil.dump() 方法
      每次从Reader 读入的数据,都会先置入 char 数组中Readerread()方法,每次会尝试读入 char 数组长度的数据,并返回实际读入的字符数,只要不是-1,就表示读取到字符。可以使用 write() 方法,指定要写出的 byte 数组、初始索引与数据长度。
    • 使用CharUtil.dump() 读入文档、转为字符串并显示在文本模式中:
    10.2.2 字符处理装饰器
    • 可以使用InputStreamReader OutputStreamWriter对串流数据打包。

    • BufferedReader BufferedWriter,可对 ReaderWriter 提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。

    • PrintWriter:除了可对OutStream打包之外,还可对Writer 进行打包,提供 print()println()format() 方法。

    要先掌握父类中方法,核心类如下:
    image

    第十一章:线程与并行API

    11.1线程简介

    线程生命周期
    Thread基本状态图

    • 从抽象观点来看,JVM是台虚拟计算机,只安装一颗称为主线程的CPU,可执行main()定义的执行流程。如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的run()方法中。
    Daemon线程
    • Daemon线程:主线程会从main()方法开始执行方法结束后停止JVM。如果主线程中启动了额外线程,默认会等待被启动的所有线程都执行完run()方法才中止JVM。
    • 在所有的非Daemon线程都结束时,JVM自动就会中止。可以使用setDeamon()方法来设定一个线程是否为Daemon线程,可以使用isDaemon()方法来判断线程是否为Daemon线程。
    • Daemon线程,在所有的非Daemon线程都结束时,JVM就会终止。
    synchronizedvolatile
    1. synchronized
    • 每个对象都会有个内部锁定,或称为监控锁定。被标示为 synchronized的区块将会被监控,任何线程要执行 synchronized区块都必须先取得指定的对象锁定。如果在方法上标示synchronized,则执行方法必须取得该实例的锁定。

    • 线程若因尝试执行synchronized区块而进入Blocked,在取得锁定之后,会先回到Runnable状态,等待CPU排版器排入Running状态。

    • java的 synchronized提供的是可重入同步,也就是线程取得某对象锁定后,若执行过程中又要执行synchronized,尝试取得锁定的对象来源又是同一个,则可以直接执行由于线程无法取得锁定时会造成阻断,不正确地使用synchronized有可能造成能效低落,另一问题则是死结,例如有些资源在多线程下彼此交叉取用,有可能造成死结。

    1. 使用volatile
    • synchronized要求达到的所标示区块的互斥性与可见性,互斥性是指synchronized区块同时间只能有一个线程,可见性是指线程离开synchronized区块后,另一线程接触到的就是上一线程改变后的对象状态。

    • 在java中对于可见性的要求,可以使用 volatile 达到变量范围。

    • 可以在变量上声明volatile,表示变量是不稳定的、易变的,也就是可能在多线程下存取,这保证变量的可见性,也就是若有线程变动了变量值,另一线程一定可以看到变更。被标示为volatile的变量,不允许线程快取,变量值的存取一定是在共享内存中进行。

    11.2 并行API

    • wait()notify()notifyAll()是object定义的方法,可以通过这3个方法控制线程释放对象的锁定,或者通知线程参与锁定竞争。

    • 若调用锁定对象的wait()方法,线程会释放对象锁定,并进入对象等待集合从而处于阻断状态,其他线程可以竞争对象锁定,取得锁定的线程可以执行synchronized范围的程序代码。

    • 放在等待集合的线程不会参与CPU排班,wait()可以指定等待时间,时间到之后线程会再次加入排班。

    • 如果指定时间0或不指定,则线程会持续等待,直到被中断(调用interrupt())或是告知(notify())可以参与排班。

    • LOCK:锁定lock对象,可以调用其lock方法,只有取得lock对象锁定的线程,才可以继续往后执行程序代码。解除锁定要调用unlock()

    • Executor:将Runnable的指定与实际如何执行分离。

    11.2.2使用Executor
    • 从JDK5 开始,定义了java.util.concurrent.Executor接口,目的是将 Runnable 的指定与实际如何执行分离。
      Executor 接口只定义了一个 execute() 方法:
    package java.util.concurrent;
    public interface Executor{
    void execute(Runnable command);
    }
    ```
    
    
    1.使用```ThreadPoolExecutor```
    
    根据不同的线程池需求,```ThreadPoolExecutor``` 拥有数种不同构造函数可供使用,不过通常会使用 ```java.util.concurrent.Executors``` 的 ```newCachedThreadPool()```、```newFixedThreadPool()``` 静态方法来创建 ```ThreadPoolExecutor``` 实例。
    
    2.使用```ScheduledThreadPoolExecutor```
    - ```ScheduledExecutorService ```的操作类```ScheduledThreadPoolExecutor```为``` ThreadPoolExecutor```的子类,具有线程池与排程功能。
    
    3.使用```ForkJoinPool```
    
    - ```java.util.ForkJoinPool```主要目的是在解决分而治之的问题
    
    - 在分而治之需要结合并行的情况下,可以使用 ```ForkJoinTask```,其操作了 ```Future``` 接口,可以让你在未来取得耗时工作的执行结果
    
    - ```ForkJoinPool``` 与其他的``` ExecutorService``` 操作不同的地方在于,它实现了工作窃取演算,其建立的线程如果完成手边任务,会尝试寻找并执行其他任务建立的子任务,让线程保持忙碌状态,有效利用处理器的能力。
    
    ## 教材学习中的问题和解决过程
    - 问题1:不明白字符处理类
    - 问题1解决方案:针对字符数据的读取,Java SE 提供了 ```java.io.Reader``` 类,其抽象化了字符数据读入的来源。
    - 问题2:不是太了解```volatile``` 
    - 问题2解决方案:表示变量是不稳定的、易变的,也就是可能在多线程下存取,这保证变量的可见性,也就是若有线程变动了变量值,另一线程一定可以看到变更。
    
    ## 代码调试中的问题和解决过程
    - 问题1:在编译JoinDemo.java中发现编译不通过问题
    - 问题1解决方案:经检查发现是由于粗心导致字符出错,修改后编译通过。由此可见,认真的必要性。
    
    ## [代码托管](http://git.oschina.net/bestiisjava2017/besti20155334/tree/master/src?dir=1&filepath=src&oid=06c02b84fcea74611a32b8ce14313cf233ffc9ed&sha=0969df9c9c693a6fc87f212f10a33b6b42ee47d5)
    ![](http://images2015.cnblogs.com/blog/1071539/201704/1071539-20170402193647524-607644886.png)
    
    
    ## 上周考试错题总结
    由于上周在蓝墨云班课APP上答题,老师也没有在[2016-2017-2 《Java程序设计》试题解析](https://group.cnblogs.com/topic/76384.html)中张贴出来,只好在同学们的博客找了些我自己也出错的问题总结下
    - 9.实现了set接口类是哪一项(B)
     
    A. ArrayList
    
    B. Hashset
    
    C. HashTable
    
    D. Collection
    
    - 12.集合API 中Set接口的特点是?(D)
    
    A .不允许重复元素,元素有顺序
    
    B .允许重复元素,元素无顺序
    
    C .允许重复元素,元素有顺序
    
    D .不允许重复元素,元素无顺序
    
    - 5.现有:
    ```
    import java.util.*;
    class ForInTest  {
      static List list=new ArrayList();
    }
    public static void main (String  []  args)  {
      list. add("a"); list. add("b");list. add( "c");
        //insert code here
        System.out.print (o);
        }
    }
    ```
    哪一行插入到第9行将导致输出“abc"?(D)
    
    A .for (Iterator o : list.iterator(); o.hasNext (); )
    
    B .for (Iterator o : list)
    
    C .for (Object o : list.iterator())
    
    D . for (Object o : list)
    ## 结对及互评
    
    
    ### 评分标准
    
    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
    - 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
    
    ### 点评过的同学博客和代码
    - 本周结对学习情况 
        - [20155319](博客链接)
        - 结对学习内容:相互查看对方代码,并对学习中遇到的疑问进行交流,合作解决编程过程中遇到的问题。
    - 上周博客互评情况
        - [20155205](http://www.cnblogs.com/haoliberale/p/6623392.html)
        - [20145207](http://www.cnblogs.com/20145207lza/p/6618647.html)
        - [20155313](http://www.cnblogs.com/bonsai/p/6624260.html)
        - [20155324](http://www.cnblogs.com/wang5324/p/6624727.html)
    
    ## 其他(感悟、思考等,可选)
    面对Java无从着手的感觉越来越重,特别是每周两章节的内容让人不堪重负,一方面要看完书中内容,另一方面要撰写博客,不知道是要边看边写,还是看完后总结的去写,导致每周都是在堆砌书上的内容,想要写出出色的博客就得不断地思考,查询相应的内容,和同学结伴而行,共同进步。
    
    ## 学习进度条
    
    |            | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
    | --------   | :----------------:|:----------------:|:---------------:  |:-----:|
    | 目标        | 5000行            |   30篇           | 400小时          |       |
    | 第一周      | 5/5               |   1/1            | 10/10            |       |
    | 第二周      | 90/95             |   1/2            | 15/25          |       |
    | 第三周      | 131/234           |   1/3            | 20/45          |       |
    | 第四周      | 289/523           |   1/4            | 21/66           |       |
    | 第五周      | 446/969           |   1/5            | 25/91           |       |
    | 第六周      | 720/1689          |   1/6            | 25/116            |       |
    参考:[软件工程软件的估计为什么这么难](http://www.cnblogs.com/xinz/archive/2011/04/05/2005978.html),[软件工程 估计方法](http://www.cnblogs.com/xinz/archive/2011/04/06/2007294.html)
    
    - 计划学习时间:30小时
    
    - 实际学习时间:25小时
    
    - 改进情况:增加了代码提交的次数和代码的数量,延长了学习时间。
    
    ## 参考资料
    
    -  [Java学习笔记(第8版)](http://book.douban.com/subject/26371167/) 
    
    -  [《Java学习笔记(第8版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
  • 相关阅读:
    每个Java开发人员都应该知道的10个基本工具
    2019年让程序员崩溃的 60 个瞬间,笑死我了
    面试官:服务器安装 JDK 还是 JRE?可以只安装 JRE 吗?
    腾讯工作近十年大佬:不是我打击你!你可能真的不会写Java
    作为Java开发人员不会饿死的5个理由
    趣味算法:国王和100个囚犯
    阿里第二轮面试:手写Java二叉树
    Linux软件安装——服务管理
    Linux帮助——重要文件
    Linux帮助——常用命令
  • 原文地址:https://www.cnblogs.com/bestixx/p/6659636.html
Copyright © 2011-2022 走看看