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
- class Calc {
- public static void main(String [] args) {
- try {
-
int x = Integer.parselnt ("42a") ;
-
//insert code here
-
System.out.print ("oops");
- }
- }
- }
下面哪行分别插入到第五行,会导致输 "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在处理路径时会将斜杠转换为右边。
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
-
博客中值得学习的或问题:
- xxx
- xxx
- ...
-
代码中值得学习的或问题:
- xxx
- xxx
- ...
-
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
- 本周结对学习情况
- 20155306
- 结对照片
- 结对学习内容
共同学习了第十三章的内容,同时对前面的内容做了一些复习。
- 上周博客互评情况
其他(感悟、思考等,可选)
这周进行了实验同事学习了第十三章的内容,慢慢的似乎学会了一些学习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小时
-
改进情况:这周的任务不算很重,同事改进了一些方法,在时间上的安排好像更为合理了一些。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)