zoukankan      html  css  js  c++  java
  • 20145213《Java程序设计学习笔记》第六周学习总结

    20145213《Java程序设计学习笔记》第六周学习总结


    说在前面的话

    上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知。在这里我还要自我批评一下,其实我事后没有及时反省,补充数据结构知识,抓紧时间掌握第九章内容,反其道而行现在要在没掌握第九章的情况下写自习第十章、第十一章的内容,简直误人子弟,一派胡言。我认罪,我有错。我深知即使点头如捣蒜,诚惶诚恐也于事无补,拿出干货才是硬道理。我会在下周二之前拿出对第九章内容理解博客。在写本周博客之前我拜访了一些数据结构学的好的同学博客,却并没有找到本周第一个吃螃蟹的人,于是饶有兴趣地看看了他们上周的学习总结,却猝不及防,灵魂深处的震撼无声无息而至。真的,我觉得有些同学学习态度真是让我望其项背,甚至望尘莫及。他们读透教材,在构建自己所理解的Java世界后,在博客中用自己的语言向读者描绘,哪怕辞藻不艳,也是隽永留芳。反观之我是生硬地搬运教材作者的话,借他人之酒杯,凑凑篇幅,实在可恨。影响更深刻的是蔡野同学在博客中表现了自己发现问题,一步步解决问题,最后把自己在过程中学到的经验与读者分享,我觉得这种钻研的劲头是难能可贵的。反求诸己,自己在碰到英文报错的情况下,大部分是寻求同学解决,剩下的是弃之不管。曾以为大家在Java自习路上,都是瘸脚的铁拐李,需要相互帮忙,相互搀扶,相互学习。现在想想,有些人认真的学习态度就可以自成最趁手的铁拐,有些人在学习上的敷衍了事确是自废一腿。情到深处泪空流,说了这么多,其实就是内心受到巨大震撼,暗流涌动,复杂的情绪源源不断从笔尖流淌而出,只有一个想到啥写啥的主线程,跳过了组织语言的线程,倒也是花了不多时间。废话不多说,开始正文吧。


    教材学习内容总结

    本周学习任务是第十章,第十一章的内容。即输入、输出与线程、并行API。

    1. 串流
    • 数据有来源和目的地,衔接两者的是串流对象。将数据从来源去除,可以使用输入串流,将数据写入目的地,可以使用输出串流。专门提供输入水管的公司叫java.io,InputStream同样,专门提供输出水管的公司叫java.io.OutputStream
    • 无论数据源或者目的地为何,只要设法取得InputStreamOutputStream的实例,接下来操作输入与输出的方式是一致的,无需理会来源或者目的地的真正形式
    • 在不使用InputStreamOutputStream时,必须使用close方法关闭串流。InputStreamOutputStream都操作java.io.Closeable接口,其父接口为java.lang.AutoCloseable接口
    • InputStreamread()方法,每次回尝试读入byte数组长度的数据,并返回实际读入的字节。
    • OutputStreamwrite()方法,指定要写出的byte数组、初始索引、数据长度。
    1. 串流继承架构
    • 串流继承架构简单来说,就是介绍InputStreamOutputStream总公司旗下的几个子公司,闻道有先后,术业有专攻之,具体想用什么水管,就要到具体指公司里去继承。
    • System.inSystem.out表示标准输入与标准输出。如果使用java.util.Scanner打包System.in,你操作Scanner的相关方法,而Scanner会代你操控System.in取得的数据,并转化为取得你想要的数据类型。
    • 可以使用SystemsetIn()方法指定InputStream实例,重新指定标准输入来源。
    • FileInputStreamInputStream的实例,可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来读取数据。 FileOutputStreamOutputStream的实例,可以指定文件名创建实例,一旦创建文档开启,接着就可以用来写出数据。不用时,都要使用close()关闭文档.
    • ByteArrayInputStreamInputStream的实例,可以指定byte数组创建实例,一旦创建就可以将byte数组当做数据源进行读取。 ByteArrayOutputStreamOutputStream的实例,可以指定byte数组创建实例,一旦创建就可以将byte数组当做目的地进行读取。
    1. 串流处理装饰器
    • InputStreamOutputStream提供串流基本操作,如果想为输入输出的数据加工处理,则可以使用打包器类,常用打包器类有具备缓冲区作用的BufferedInputStream,BufferedOutputStream具备数据转换处理作用的DataInputStream,DataOutputStream具备对象串行化能力的ObjectInputStream,``` ObjectOutputStream ````
    1. 字符处理类
    • 针对字符数据的读取,JavaSE提供了java.io.Reader类,其抽象化了字符数据读入的来源。针对字符数据的写入,则提供了java.io.Writer类,其抽象化了数据写出的目的地。
    • FileReaderFileWriter则可以对文档做读取与写入,读取或写入时默认会使用操作系统默认编码来做字符转换。在启动JVM时,可以指定-Dfile.encoding来制定FileReaderFileWriter所使用的编码。
    • ReaderWriter也有一些装饰器类可供使用。如果串流处理的字节数据,实际上代表某些字符的编码数据,而你想要将这些一些字节数据转换为对应的编码字符,可以使用InputStreamReaderOutputStreamWriter对串流数据打包。BufferedInputStream,BufferedOutputStream对串流数据打包

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

    又是这个模块了,每次都会有种“少年不识愁滋味,为赋新词强说愁”的感觉。其实我的自习过程就是古井无波的。然而在自习过程中没有问题产生,博客写到这里又没有问题可以在这里提出,我有隐隐觉得这是一个很大的问题。这是不是暴露出我学习积极性不高,没有热情呢?一想到自己缺少其他同学钻研的劲头,我心里隐隐发慌。如果硬要说我在教材学习中碰到什么问题,那就是为什么我会比其他同学缺少发现问题的思考与热情。


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

    一开始我求平均数的方法代码如下:

    public void showAvg() {
            double sum1 = 0;
            double sum2 = 0;
            double sum3 = 0;
            int number = 2;
                    for (int i = 0; i < n.length; i++) {
                    if (n[i] != null) {
                    sum1 = n[i].Chinese + sum1;
                    sum2 = n[i].English + sum2;
                    sum3 = n[i].Math + sum3;
                    continue;
                }
            System.out.println("Chinese的平均分:" + sum1 / i + "English的平均分:" + sum2 / i + "Math的平均分:" + sum3 / i);
            }
        }
    

    执行结果如下

    第一次求平均数是正确,但接下来竟不断进行求平均数,很明显没有在适宜的时机退出for循环语句,因此我做出以下代码改变:

    public void showAvg() {
            double sum1 = 0;
            double sum2 = 0;
            double sum3 = 0;
            int number = 2;
                    for (int i = 0; i < n.length; i++) {
                    if (n[i] != null) {
                    sum1 = n[i].Chinese + sum1;
                    sum2 = n[i].English + sum2;
                    sum3 = n[i].Math + sum3;
                    continue;
                }
                else 
                    break;
            }
                System.out.println("Chinese的平均分:" + sum1 / (i-1) + "English的平均分:" + sum2 / (i-1) + "Math的平均分:" + sum3 / (i-1));
            
       }
    

    所以做出这样改变,我是想在n[i]读取到null的时候退出for循环,这个代码放在C语言中是没有问题的,但唉Java中却出现编译失败,显示未定义i。后来在咨询同学后才明白这个i我是放在for循环中定义的,在退出for循环后,i就定义失效了。因此,我又做出如下改变:

    public void showAvg() {
            double sum1 = 0;
            double sum2 = 0;
            double sum3 = 0;
            int number = 0;
                    for (int i = 0; i < n.length; i++) {
                    number=i;
                    if (n[i] != null) {
                    sum1 = n[i].Chinese + sum1;
                    sum2 = n[i].English + sum2;
                    sum3 = n[i].Math + sum3;
                    continue;
                } else
                    break;
            }
            System.out.println("Chinese的平均分:" + sum1/number  + "English的平均分:" + sum2 /number + "Math的平均分:" + sum3 / number);
       }
    

    其他

    代码托管如下:








    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 20/20 1/1 10/10
    第二周 200/220 1/2 15/25
    第三周 200/420 1/3 15/40
    第四周 200/620 1/4 15/55
    第五周 100/720 1/5 10/65
    第六周 200/920 1/6 15/80

    参考资料

    *Java学习笔记(第8版)
    *《Java学习笔记(第8版)》学习指导

  • 相关阅读:
    Java实现各种内部排序算法
    Java实现堆排序(大根堆)
    Java对象的序列化和反序列化
    Java实现链式存储的二叉查找树(递归方法)
    337. House Robber III(包含I和II)
    318. Maximum Product of Word Lengths
    114. Flatten Binary Tree to Linked List
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    96. Unique Binary Search Trees(I 和 II)
  • 原文地址:https://www.cnblogs.com/qiwei/p/5374512.html
Copyright © 2011-2022 走看看