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

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

教材学习内容总结

第十三章 时间与日期

认识时间与日期

时间的度量

  • 格林威治标准时间(GMT),现已不作为标准时间使用,即使标注为GMT(格林威治时间),实际上谈到的的是UTC(Unix时间)时间。
  • 世界时(UT),通过观测远方星体跨过子午线而得,受地球自转速度影响有误差。
  • 秒的单位定义时基于TAI。也就是铯原子辐射的振动次数。
  • 世界协调时间(UTC),UTC考虑了地球自转越来越慢而有闰秒修正,确保UTC与UT相差不会超过0.9秒。
  • Unix时间,Unix系统时间表示法,定义为UTC时间1970年1月1日为起点经过的秒数,不考虑闰秒修正。
  • epoch,某个特定时间开始,时间轴上的某一瞬间。

年历简介

  • 儒略历:现今公历的前身,修正了罗马历隔三年设置一闰年的错误,改采四年一闰。
  • 格里高利历:改革了儒略历,将儒略历1582年10月4号星期四的隔天,订为格里高利历1582年10月15日星期五。
  • ISO 8601标准:统一时间日期的数据交换格式,例如:yyyy-mm-ddTHHH:MM:SS.SSS等。

时区

  • UTC偏移:精度每15度偏移1小时,通常表示Z符号。
  • 日观节约时间:夏、冬日照时间差异很大时实施。

认识Date与Calendar

时间轴上瞬间的Date

  • Date:取得系统时间,方法之一就是使用System.currentTimeMillis()方法,返回long类型整数,代表1970年1月1日0时0分0秒0毫秒至今经过的毫秒数。Date有两个构造函数可以使用,一个可使用epoch毫秒数构建,另一个为无自变量构造函数,内部亦是使用System.currentTimeMillis()取得毫秒数,调用getTime()可取得内部保存的epoch毫秒数值。
    相关练习代码见码云中的DateDemo.java,运行结果如下

格式化时间日期的DateFormat

  • DateFormat是个抽象类,其操作类是java.text.SimpleDateFormat,你可以直接构建SimpleDateFormat实例,或是使用DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance等静态方法,用较简便方式按不同需求取得SimpleDateFormat实例。可以通过DateForm的各种静态方法进行格式化,使用模式字符串自定义格式,使用parse()方法将指定的字符串剖析为Date实例。
    相关练习代码见码云中的DateFormatDemo.java,运行结果如下

Calendar: 时间的运算

  • Calendar:想要取得某个时间日期信息,或者是对时间日期进行操作,可以使用Calendar实例。Calendar是个抽象类,java.util.GregorianCalendar是其子类,操作了儒略历与格里高利历的混合历。可以设定时间日期等字段,使用add()方法改变Calendar的时间,使用roll()方法加减日期中某个字段,使用after()或before()方法比较两个Calendar的时间日期先后。
    相关练习代码见码云中的CalendarUtil.java运行结果如下

设定TimeZone

  • 可以使用java.util.TimeZone的getDefault()来取得默认时区信息。
    相关练习代码见码云中的TimeZoneDemo.java以及TimeZoneDemo2.java运行结果分别如下

JDK8新时间日期API

机器时间 Instant

  • 许多开发者并不知道过去有过日光节约时间,在取得Date实例后,被名称Date误导,认为他们代表日期,真正可靠的信息只有内含epoch毫秒数。所以不应该使用Data实例来得知人类观点的时间信息,可以使用Instant的静态方法now()取得代表Java epoch毫秒数的Instant实例。

人类时间(ISO8601 标准)

  • LocalDateTime包括日期与时间;LocalDate只有日期,如果设定不存在的日期会抛出DateTimeException;LocalTime只有时间。
  • ZonedDateTime:当补上时区信息后组合起来的时间实际上不存在时,ZonedDateTime会自动更正。
  • 若需要时区信息,可基于上述三个时间描述的ZoneDateTime和OffsetDateTIme。相关练习代码见码云中的MonthDemo.java,运行结果如下

对时间的运算

  • TemporalAmount的操作类是Period和Duration。ofPattern()是java.time.format.DateTimeFormatter的静态方法,对于年、月、星期、日的日期差使用Period类定义,plus()方法可以接受Duration实例来计算,对于时间计量,类Duration来定义。
  • plus()方法另一重载版本接受java.time.temporal.TemporalUnit实例,java.time.temporal.ChronoUnit是TemporalUnit实作类,使用enum实作,定义了between()等方法。
  • TemporalAccessor定义了只读的时间对象。

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

  • 问题1:书上对于before()方法以及after()方法没有明确的指示,那么究竟是怎样一个机制呢?
  • 问题1解决方案:查询了API,得到如下结果
    before方法:
    public boolean before(Date when)测试此日期是否在指定日期之前。
    参数:when - 日期。
    返回:当且仅当此 Date 对象表示的瞬间比 when 表示的瞬间早,才返回 true;否则返回 false。
    抛出:
    NullPointerException - 如果 when 为 null。
    after方法
    public boolean after(Date when)测试此日期是否在指定日期之后。
    参数:when - 日期。
    返回:当且仅当此 Date 对象表示的瞬间比 when 表示的瞬间晚,才返回 true;否则返回 false。
    抛出:
    NullPointerException - 如果 when 为 null。

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

  • 问题1:在学习Calendar时练习的代码码云中的CalendarUtil.java时有如下代码
while (calendar.before(end)) {
            calendar.add(Calendar.YEAR, 1);
            years++;
        }
        return years -1;

返回值是在得到的years值上减去了1,这是为什么?

  • 问题1解决方案:问题1解决方案:将减去一去掉,再进行了编译,发现值大了一个,因此得到了自己的理解,这里的before是不是并不是真正意义上的before而更像是>=(大于等于)这样一个作用,上网查询之后发现的确有这样的问题,但并不是>=这样的关系,而是要根据设定的时间是自己设定的还是系统设定的来判断,也就是before和after方法的危险性。

代码托管

上周考试错题总结

  • 下面哪条命令可以把 f1.txt 复制为 f2.txt ?
    A .
    cp f1.txt f2.txt
    B .
    copy f1.txt f2.txt
    C .
    cat f1.txt > f2.tx
    D .
    cp f1.txt | f2.tx
    E .
    copy f1.txt | f2.tx
    答案:A、C,解析copy是Windows下的命令。cat f1.txt > f2.tx通过输出重定向实现了复制。
  • 下面代码中共有()个线程?
    public class ThreadTest {
    public static void main(String args[]){
    MyThread myThread =new MyThread();
    Thread t1=new Thread(myThread);
    Thread t2=new Thread(myThread);
    t1.start();
    t2.start();
    }
    }
    class MyThread extends Thread {
    ...
    }
    答案:三个,不能忘记main这个主线程。
  • 如果有以下代码段:
    Thread thread = new Thread(new ________________() {
    public void run() {...}
    });

空白部分指定哪些类型可以通过编译?
A .
Runnable
B .
Thread
C .
Future
D .
Executor
答案: A B,解析:Thread类的构造方法中,需要一个实现了Runnable接口的对象,而new就是生成了个Runnable接口下的一个实例对象。而Thread 也实现了 Runnable 接口。

  • 调用线程的interrupt()方法 ,会抛出()异常对象?
    A .
    IOException
    B .
    IllegalStateException
    C .
    RuntimeException
    D .
    InterruptedException
    E .
    SecurityException
    答案:D、E
  1. class Calc {
  2. public static void main(String [] args) {
  3. try {
  4.     int x = Integer.parselnt ("42a") ;
    
  5. //insert code here
    
  6.     System.out.print ("oops");
    
  7. }
  8. }
  9. }
    下面哪行分别插入到第五行,会导致输 "oops" ?
    A .
    catch (IllegalArgumentException e) {

B .
} catch (IllegalStateException c) {

C .
} catch (NumbelFormatException n) {

D .
} catch (ClassCastException c) {
答案:A、C

  • Given an instance of a Stream, s, and a Collection, c, which are valid ways of creating a parallel stream? (Choose all that apply.)
    给定一个Stream的实例s,一个Collection的实例c, 下面哪些选项可以创建一个并行流?

A .
new ParallelStream(s)
B .
c.parallel()
C .
s.parallelStream()
D .
c.parallelStream()
E .
new ParallelStream(c)
F .
s.parallel()
答案:D、F,解析d ,f没有parallelstream这样的类,所以a和e不正确。在流类中定义的方法,以从现有流创建并行流( ) ;因此f是正确的,c是不正确的。在集合类中定义的从集合中创建并行流的方法是parallelstream ( );因此d是正确的,b是不正确的。

  • Assuming / is the root directory, which of the following are true statements? (Choose all that apply.)

A .
/home/parrot is an absolute path.

B .
/home/parrot is a directory.

C .
/home/parrot is a relative path.

D .
The path pointed to from a File object must exist.

E .
The parent of the path pointed to by a File object must exist.
答案:A,解析:以root目录开始的路径是绝对路径,因此a是正确的,c是不正确的。b不正确,因为路径可以是文件系统中的文件或目录。文件对象可能指文件系统中不存在的路径,因此d和e不正确。

  • What is the result of executing the following code? (Choose all that apply.)
    String line;
    Console c = System.console();
    Writer w = c.writer();
    if ((line = c.readLine()) != null)
    w.append(line);
    w.flush();

A .
The code runs without error but prints nothing.

B .
The code prints what was entered by the user.

C .
An ArrayIndexOutOfBoundsException might be thrown.

D .
A NullPointerException might be thrown.

E .
An IOException might be thrown.

F .
The code does not compile.
答案:B D E,解析:这是从控制台读取线路并将其写回控制台的正确代码,从而使选项b。选项d和e也是正确的。如果不存在con a,则会抛出nullpointerexception。附加()方法抛出anioexception。

  • Which of the following are true? (Choose all that apply.)

A .
A new Console object is created every time System.console() is called.

B .
Console can only be used for reading input and not writing output.

C .
Console is obtained using the singleton pattern.

D .
When getting a Console object, it might be null.

E .
When getting a Console object, it will never be null.
答案:C D,解析:控制台对象是由JVM创建的。因为只有一个存在,它是一个单例,多次激活密钥选项c是正确的.如果程序在没有控制台的环境中运行,系统。控制台( )返回null,使d也正确。关于控制台的其他语句不正确。

  • Which classes will allow the following to compile? (Choose all that apply.)
    InputStream is = new BufferedInputStream(new FileInputStream("zoo.txt"));
    InputStream wrapper = new _____(is);

A .
BufferedInputStream

B .
FileInputStream

C .
BufferedWriter

D .
ObjectInputStream

E .
ObjectOutputStream

F .
BufferedReader
答案: A D,解析:引用是inputstream对象,因此只允许高级别的输入流类。b不正确,因为fileinputstream是一个与文件资源直接交互的低级流,而不是流资源。c和f不正确,因为您可以-不直接在流上使用bufferedreader。e是不正确的,因为参考是inputstream,而不是outputstream。a和d是唯一正确的选项。请注意,bufferedinputstream可以封装两次,因为高级流可以采用其他高级别流。

  • Suppose that the file c:\book\java exists. Which of the following lines of code creates an object that represents the file? (Choose all that apply.)

A .
new File("c:\book\java");

B .
new File("c:\book\java");

C .
new File("c:/book/java");

D .
new File("c://book//java");

E .
None of the above
答案:B C,解析:选项b是正确的,因为Java要求用另一个反斜杠转义反斜杠。选项c也是正确的,因为Java在处理路径时会将斜杠转换为右边。

结对及互评

评分标准

  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

  • 参考示例

点评过的同学博客和代码

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

这周进行了实验同事学习了第十三章的内容,慢慢的似乎学会了一些学习java的方法,这周的任务不是很重,因此学习了上周的一部分内容以及一些代码,希望在接下来的Java学习时间中可以得到一些更好的java学习方法。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 20/20 1/4 20/20
第二周 145/165 1/5 12/32
第三周 411/576 1/6 16/48
第四周 1021/1597 1/7 25/73
第五周 1115/2712 1/8 28/103
第六周 1126/3838 1/9 20/123
第七周 574/4412 2/11 18/141

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

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

  • 计划学习时间:20小时

  • 实际学习时间:18小时

  • 改进情况:这周的任务不算很重,同事改进了一些方法,在时间上的安排好像更为合理了一些。

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

参考资料

posted @ 2017-04-08 22:14  20155339平措卓玛  阅读(335)  评论(7编辑  收藏  举报