20155303 2016-2017-2 《Java程序设计》第七周学习总结
教材学习中的问题和解决过程
-
『问题一』:
SimpleDateFormat
中每个字符的含义都是什么?
『问题一解决』:API文档中有详细的说明:
比如以下程序,我定义的格式是 yyyy-ww-DD
,输出结果表示当前日期是该年第14周,第97天。
-
『问题二』:课本P435提到
clone()
复制对象的功能,这属于创建对象的方式吗?
『问题二解决』: clone()
复制对象与 new
都是创建对象的方式。之前课本上曾介绍过浅层复制(Shallow Copy)与深层复制(Deep Copy),这次借助 clone()
进一步学习。
【复制参考与复制对象】:回顾之前学过的“复制参考”,编写以下程序:
当执行完Person p1 = p;
之后真的创建了一个新对象吗?我们来看一下打印结果:
可以看到打印的地址值是相同的。也就是说,这一步只实现了引用的复制,也就是p1与p指向了一个相同的对象“Person("Justin", 20150001)”。
而clone()
能够实现复制对象,而不仅仅是复制参考。以下面这个程序为例:
打印结果为:
可以看出,clone()
重新分配内存,而不是把原对象的地址赋给了一个新的引用变量。
【浅拷贝与深拷贝】:继续分析上例,ID是基本数据类型,直接将数值拷贝过来就行。但是name是String类型的,它只是一个引用,指向一个真正的String对象,那么对它的拷贝有两种方式:
①直接将源对象中的name的引用值拷贝给新对象的name字段;
②根据原Person对象中的name指向的字符串对象创建一个新的相同的字符串对象,将这个新字符串对象的引用赋给新拷贝的Person对象的name字段。
这两种拷贝方式分别叫做浅拷贝和深拷贝。
修改上面的代码,如果name的地址值相同,说明两个对象的name都指向同一个String对象,是浅拷贝;如果两个对象的name的地址值不同,那么就说明指向不同的String对象,也就是在拷贝对象的时候,同时拷贝了name引用的String对象,也就是深拷贝。
运行结果如下:
name的地址值是相同的,所以这种拷贝方式是浅拷贝。
那么如何实现深拷贝呢?我们必须在类中实现Cloneable接口,并且重写clone方法,创建一个拷贝类的对象,如下程序:
打印结果为:
可以看到,两个对象的p指向的不是同一个对象,这就是深拷贝。
-
『问题三』:课本P435提到“想比较两个Calendar”的时间日期先后,可以使用
after()
或before()
方法。那么,这两个方法具体怎么使用呢?
『问题三解决』:查询API文档可知,after()
返回值为布尔类型,其等价于compareTo(when)>0
,为真返回true,否则返回false。before()
同理,等价于compareTo(when)<0
。
代码调试中的问题和解决过程
-
『问题一』:运行课本P432
HowOld
程序时,忽略了L
类型转换,得到了下面错误的结果(433岁!?):
在365*24*60*60*1000
后面添加L
或l
得到正确输出:
『问题一解决』:365*24*60*60*1000
的计算结果是31536000000,超出了int范围,在二进制中只保留后32位,为1471228928,因此会出现以上错误结果。使用计算器或许能更加清晰地展示出来:
-
『问题二』:关于
System.currentTimeMills()
方法的使用问题。
『问题二解决』:查询API文档可知,currentTimeMills()
返回值代表1970年1月1日0时0分0秒0毫秒至今经过的毫秒数。
考虑到这一点,可以调用该方法计算程序运行时间。以下面这个程序为例,在主线程开始和结束时分别调用currentTimeMills()
方法,计算差值即为程序运行时间(单位:毫秒):
需要注意的是,同一程序程序运行时间也有可能不同,这与此时CPU状态有关,所以此方法只能大致估计程序的运行时间。不过可作为程序优化的一点参考。
代码托管
上周考试错题总结
- 『题目一』:
下面哪条命令可以把 f1.txt 复制为 f2.txt ?(AC)
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
『考点』:copy是Windows下的命令。cat f1.txt > f2.tx 通过输出重定向实现了复制。
- 『题目二』:
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, 下面哪些选项可以创建一个并行流?(DF)
A .new ParallelStream(s)
B .c.parallel()
C .s.parallelStream()
D .c.parallelStream()
E .new ParallelStream(c)
F .s.parallel()
『考点』:Parallelstream()
方法不存在,“P”不能大写,所以A和E是不正确的。API中对parallel()
的定义为:在Stream
类中从现有流创建一个并行流,因此F是正确的,C是错误的。API中对parallelstream()
的定义为:在Collection
类中从一个集合创建一个并行流,因此D是正确的,B是错误的。
- 『题目三』:
Which of the following statements about the Callable call() and Runnable run() methods are correct? (Choose all that apply.) (ACDF)(My answer:CD)
A .Both can throw unchecked exceptions.
B .Callable takes a generic method argument.
C .Callable can throw a checked exception.
D .Both can be implemented with lambda expressions.
E .Runnable returns a generic type.
F .Callable returns a generic type.
G .Both methods return void
『考点』:查询API文档关于Callable
接口的说明可以看到,Callable
支持泛型,且Callable
和Runable
都能抛出非受检异常,而能抛出受检异常的只有Callable
。
- 『题目四』:
What are some reasons to use a character stream, such as Reader/Writer, over a byte stream, such as InputStream/OutputStream? (Choose all that apply.)
在下列哪些情况下使用字符流(比如Reader/Writer)而不使用字节流(比如InputStream/OutputStream)?(AC)
A .More convenient code syntax when working with String data
B .Improved performance
C .Automatic character encoding
D .Built-in serialization and deserialization
E .Character streams are high-level streams
F .Multi-threading support
『考点』:
A:字符流包含能够非常便利处理字符串数据的方法,所以A是正确的;C:字符流有其特有的编码方式,能够自动处理字符编码问题,C也是正确的。
其他选项,如B:性能改进,D:内置的序列化和反序列化,E:字符流是更高级的流,F:字符流支持多线程等等,这些说法都是不相关,或是不正确的。
- 『题目五』:
Assuming / is the root directory, which of the following are true statements? (Choose all that apply.)(A)
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是正确的,C是错误的。B是不正确的,因为路径可能是文件系统中的文件(file)或目录(directory)。文件对象可以指向文件系统中不存在的路径,所以D和E是错误的。
- 『题目六』:
What is the result of executing the following code? (Choose all that apply.)(BDE)
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正确;查询API文档可知,调用console()
方法可能会抛出NullPointerException
异常,D正确;调用append()
方法可能会抛出IOException
异常。
结对及互评
本周结对学习情况
结对同学学号20145202马超
结对学习内容:查看代码互相学习;另外非常感谢马超同学针对实验一我编写的“学生成绩管理系统”程序提出的建议!(详见我的博客《Java程序设计》实验一(Java开发环境的熟悉)实验报告)对于我其他程序中存在的问题,也欢迎同学们指正~
第七周博客互评情况
(稍后更新)
其他(感悟、思考等,可选)
这周的考试再一次给我们敲响警钟,只看不动手,只读不思考,都无法真正掌握。比如题中出现了一部分异常处理的知识,如果只靠死记硬背而不查询API文档,费时费力还很难达到灵活应用。这周学习任务比较轻松,可以利用这个机会巩固前面所学知识,夯实基础。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 16/16 | 1/1 | 18/18 | 初步认识了Java |
第二周 | 219/235 | 1/2 | 28/46 | 学习了Java的基本语法知识 |
第三周 | 766/1001 | 1/3 | 23/69 | 了解对象与参考的关系,以及封装的概念与实现 |
第四周 | 984/1985 | 1/4 | 18/87 | 学习了继承与多态的关系,以及接口的多态操作 |
第五周 | 866/2851 | 1/5 | 12/99 | 学习了异常处理,学会使用Collection收集对象 |
第六周 | 664/3515 | 1/6 | 15/114 | 认识字节流和字符流的继承架构,学习线程与并行API |
第七周 | 469/3984 | 1/7 | 13/127 | 认识Date与Calender |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:10小时
实际学习时间:13小时
(有空多看看现代软件工程课件:软件工程师能力自我评价表)
参考资料
20155303 2016-2017-2 《Java程序设计》第七周学习总结的更多相关文章
-
201521123027 <;java程序设计>;第七周学习总结
1.本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: 源代码: //contains()方法 public boolean c ...
-
20155303 2016-2017-2 《Java程序设计》第二周学习总结
20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...
-
20155303 2016-2017-2 《Java程序设计》第九周学习总结
20155303 2016-2017-2 <Java程序设计>第九周学习总结 目录 学习内容总结(Linux命令) 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...
-
20155303 2016-2017-2 《Java程序设计》第一周学习总结
20155303 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 浏览教材,根据自己的理解每章提出一个问题 Chapter1 Java平台概论:MyProgr ...
-
201871010106-丁宣元 《面向对象程序设计(java)》第七周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第七周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...
-
20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
-
21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
-
20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
-
20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结
20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...
-
20145237 《Java程序设计》第九周学习总结
20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...
随机推荐
-
小波包分解 仿真 matlab
clc;close all;clear;fs = 100000;t = 1: 100;x = sin(2*pi*4000* t/fs) + sin(2*pi*40000*t/fs); %db8[Lo_ ...
-
如何将Js代码封装成Jquery插件
很多相同的Jquery代码会在很多页面使用,每次都复制粘贴太麻烦了,不如封装成一个Jquery插件就方便了,至于影响网页的速度不,我就没有测试了哈. 代码如下 这是一个自定闪烁打印文字的Jquery特 ...
-
connot resolve symbol R
出现这个原因大都是layout里的xml文件出错,就不会自动生成R文件
-
web开发workflow
web development是一个创建和实施一个新的互联网展示的过程,web网站可以是个非常成熟包罗万象的网站,也可以只是一个blog或者一两个页面.如果未做好充分的准备,web开发将是一个非常复杂 ...
-
SQL游标遍历数据表
DECLARE @资产编号 VARCHAR(50) ,@gsid VARCHAR(50) DECLARE test_Cursor CURSOR LOCAL FOR SELECT 资产编号,gsid F ...
-
☀【移动】Google Maps JavaScript API v3
Google Maps JavaScript API v3https://developers.google.com/maps/documentation/javascript/tutorial?hl ...
-
[性能分析]linux文件描述符(转)
1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...
-
Entity FramWork - 在VS里面直接创建表,并同步到数据库
前面具体添加什么直接看: 1.Entity - 使用EF框架进行增删改查 - 模型先行 2.Entity - 使用EF框架进行增删改查 - 数据库先行 然后: 然后右键,可以添加[实体],也就是表.之 ...
-
Java中clone方法的使用
什么是clone 在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,并 ...
-
JVM运行时数据区与JVM堆内存模型小结
前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...