您的位置:首页 > 编程语言 > Java开发

20155318 2016-2017-2 《Java程序设计》第七学习总结

2017-04-09 15:55 477 查看

20155318 2016-2017-2 《Java程序设计》第七学习总结

教材学习内容总结

学习目标

了解Lambda语法

了解方法引用

了解Fucntional与Stream API

掌握Date与Calendar的应用

会使用JDK8新的时间API

Lambda语法

一种匿名方法

表达式构成

括号以及括号里用逗号分隔的参数列表

仅有一个参数的可以省略括号

->符号

花括号以及花括号里的语句

仅有一条语句时可以省略花括号,并且这条语句的值将作为return返回值。

作用域

进行变量捕捉

时间

格林威治标准时间(GMT),现已不作为标准时间使用,即使标注为GMT(格林威治时间),实际上谈到的的是UTC(Unix时间)时间。

在1972年引入UTC之前,GMT与UT是相同的。

秒的单位定义时基于TAI。也就是铯原子辐射的振动次数。

世界协调时间(UTC),UTC考虑了地球自转越来越慢而有闰秒修正,确保UTC与UT相差不会超过0.9秒。

年历

儒略历修正了罗马历隔三年设置一闰年的错误,改采四年一闰。

格里高利历将儒略历1582年10月4号星期四的隔天,订为格里高利历1582年10月15日星期五。

ISO 8601标准采用统一的数据格式。

Date

无自变量构造函数,内部为
System.currentTimeMillis()
,返回long型,代表1970年1月1日0时0分0秒0毫秒至今的毫秒数

调用
getTime()
可取得内部保存的epoch毫秒数值

DateFormat是抽象类,格式化成人类理解的年月日时分秒,操作类
java.text.SimpleDateFormat


Calendar

getInstance(): 默认取得GregorianCalendar实例

getTime():取得Date实例

get():取得年月日字段

add():改变Calendar的时间

roll():加减日期中某个字段

after()/before():比较两个Calendar的时间日期先后

JDK8新时间日期API

机器时间 Instant(内含epoch毫秒数)

静态方法now():取得代表Java epoch毫秒数的Instant实例

人类时间(ISO8601 标准)

LocalDateTime:包括日期与时间

LocalDate:只有日期,设定不存在的日期时会抛出DateTimeException错误。

LocalTime:只有时间。

ZonedDateTime:当补上时区信息后组合起来的时间实际上不存在时,ZonedDateTime会自动更正。

OffsetdateTime:单纯代表UTC偏移量,使用ISO 8601

Year、YearMonth、Month、MonthDay:如果只想要表示年或月,使用Year或Month;如果想要表示年月或月日,使用YearMonth或MonthDay。

时间运算

TemporalAmount:时间差以Duration定义,日期差以Period定义

TemporalUnit:between()方法用于计算时间差

TemporalAccessor:定义了只读的时间对象

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

问题1:API文档中有这样的一段话: Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone方法将会导致在运行时抛出异常。p435 CalendarUtil.java: Calendar测试为什么直接调用clone()?

代码片段

public static long yearsBetween(Calendar begin, Calendar end) {
Calendar calendar = (Calendar) begin.clone();
long years = 0;
while (calendar.before(end)) {
calendar.add(Calendar.YEAR, 1);
years++;
}
return years - 1;
}

public static long daysBetween(Calendar begin, Calendar end) {
Calendar calendar = (Calendar) begin.clone();
long days = 0;
while (calendar.before(end)) {
calendar.add(Calendar.DATE, 1);
days++;
}
return days - 1;
}
}


解决方案:当需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,可以使用clone方法,程序中为了在Calendar实例上进行add()操作的时候,保证自身变量不会被修改,对自变量进行一次clone()复制对象的操作。但是Object类本身不实现接口Cloneable,所以在类为Object的对象上调用clone方法将会导致在运行时抛出异常。

问题2:如何计算一个程序的运行时间

解决方案:结合这周学习的知识,查询资料,发现都是在程序一开始先获取时间,然后运行程序,在程序结束后再获取时间,求时间差。

startTime = System.currentTimeMillis();//获取当前时间
//doSomeThing();   //要运行的java程序
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:"+(endTime-startTime)+"ms");


但是具体的问题还要结合具体问题来分析,比如有的程序非常短,执行时间也非常短,就可以让程序执行多次,从而提高获得时间的精确度。比如计算程序循环10000次的时间:

for(int i=0;i<10000;i++){//计算循环10000的时间
str=str+i;
}

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

问题1:由教材中学习的第一个问题引申而来:clone() 和“=”的比较

解决方案:参考了java clone和深度复制和浅复制的个人总结这篇文章中对这个问题的解读。总结为:

在基本类型变量里
=
是赋值符号b=a,a与b有相同的值,改变a或b的值不影响彼此

对象间的:

Java.util.Date date1 = new java.util.Date();
java.util.Date date2 = date1;

表示date1 与date2指向相同的对象,指向相同的存储空间。

clone()

java.util.Date date1 = new java.util.Date();
java.util.Date date2 = (java.util.Date)date1.clone;

date1 与date2指向不相同的对象,但数据是相同的,就像是两个衣着相同的不同的人.

问题2:getValue()与oridinal()

解决方案:取得代表月份的数字时,要通过getValue()方法,如果用oridinal()方法会出现比实际情况小一的情况

代码托管

代码行数统计





上周考试错题总结

错题1:下面哪条命令可以把 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 通过输出重定向实现了复制。

错题2:下面代码中共有()个线程?

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 {
...
}


A .1

B .2

C .3

D .4

正确答案: C

错题3:以下()方法会使线程进入阻塞状态?

A .Thread.sleep()

B .wait()

C .notify()

D .interrupt()

正确答案: A B

错题4:如果有以下代码段:

Thread thread = new Thread(new ________________() {
public void run() {...}
});


空白部分指定哪些类型可以通过编译?

A .Runnable

B .Thread

C .Future

D .Executor

正确答案: A B

错题5:调用线程的interrupt()方法 ,会抛出()异常对象?

A .IOException

B .IllegalStateException

C .RuntimeException

D .InterruptedException

E .SecurityException

正确答案: D E

错题6:现有

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

错题7:现有

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) {

错题8: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. There is no such class as ParallelStream, so A and E are incorrect. The method defined in the Stream class to create a parallel stream from an existing stream is parallel(); therefore F is correct and C is incorrect. The method defined in the Collection class to create a parallel stream from a collection is parallelStream(); therefore D is correct and B is incorrect.

结对及互评

点评过的同学博客和代码

本周结对学习情况

20145226

结对照片



结对学习内容

学习partner的代码并作出点评

学习partner的博客和自己的博客做对比,找出不足

上周博客互评情况

20155314

20155210

20155301

20155208

20155305

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

这周进行了Java的第一次实验,很多代码量都是实验贡献的,Java教材的学习接近尾声,但是自己不看书独自编代码还是会出现很多问题,这是接下来这几周首要攻克的问题。

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周50/1001/124/24安装学习Java的一系列软件
第二周250/3001/230/54了解Java的基本语法
第三周552/8521/316/60了解Java是面向对象的语言
第四周717/15691/410/70了解Java继承与接口
第五周495/20641/56/76了解异常处理,学会使用Collection收集对象
第六周754/28181/66/82了解串流和线程
第七周679/34932/85/87了解时间与日期,掌握Date和Calendar的一些用法
计划学习时间:6小时

实际学习时间:5小时

参考资料

Java学习笔记(第8版)

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

java clone和深度复制和浅复制的个人总结

Java获取系统时间的四种方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: