201521123069 《Java程序设计》 第2周学习总结
1. 本章学习总结
(1)String类、StringBuilder类(频繁进行字符串的修改应选用StringBuilder,不会生成大量的字符串对象)、Math类的用法、字符串池的概念
(2)Scanner扫描器用法
(3)一维数组、二维数组及多维数组的使用(数组的静态初始化、动态初始化、数组元素的引用)、利用Arrays类相应的方法对数组进行复制、打印、排序等操作。
(4)完全限定类名(包名+类名)、包的使用、使用命令行对带有包名的java文件进行编译、运行。
(5)ArrayList的特性(ArrayList使用数组存储数据,ArrayList有个可指定容量的构造函数,可以建立足够长度的数组,方便进行插入、删除操作)。
2. 书面作业
Q1. 使用Eclipse关联jdk源代码(截图),并查看String对象的源代码?简单分析String对象的设计思路。
答:先创建一个由"public final"修饰的String类,String类中含方法名相同的无参构造方法及有参构造方法(字符数组,整形数组,字符串,字节数组等作为参数),在创建String对象时,会根据不同的参数选择相应的构造方法。
Q2.为什么要尽量频繁的对字符串的修改操作应该是用StringBuilder而不是String?
答:用StringBuilder对字符串进行频繁的修改操作, 不会产生新的字符串对象,占用的内存小,而用String则会产生大量的字符串对象,占用的内存空间大,显然,用StringBuilder的效率高。
Q3.比较两个字符串的值是否相等?为什么不能用==直接进行比较?
答:用==比较的是引用的值,即比较两个字符串的内存地址是否相同。比较两个字符串的值应该使用equals方法。
Q4.尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi", str2="hi";
String str3 = new String(str1);
System.out.println(str1==str2);
答:遇到"String str1 ="hi";"语句时,Java会先在字符串池中寻找是否存在"hi"这个字符串,发现没有,则新建一个"hi"对象,让str1指向这个对象的内存地址,然后遇到"String str2 ="hi";"语句时,Java在字符串池中找到了"hi"字符串,则让str2也指向字符串池中的"hi"对象的内存地址。之后遇到"String str3 = new String(str1);"语句,则不会去访问字符串池,而是直接新建一个"hi"字符串对象,让str3指向新的"hi"对象的内存地址。最后遇到"System.out.println(str1==str2);"由于str1与str2指向的是同一个内存地址,所以程序输出结果为true,上面的代码创建了2个字符串对象。
Q5.Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i
答:从J2SE5.0之后提供了自动装箱功能,即将基本类型打包在对象之中,上述代码相当于"Integer i=new Integer(100);"。
Q6.尝试分析下面代码输出结果
Integer i1 = 127;Integer i2 = 127;
i1 == i2;//true of false?
Integer i1 = 128;Integer i2 = 128;
i1 == i2;//true of false
答:本题中用到了自动装箱功能,实际上会用Integer.valueof()来建立Integer实例,第一条语句由于127在-128~127之间,会从缓存中传回Integer实例,第二条语句要打包的也是127,也是从缓存中返回同一Integer实例,因为i1,i2指向的是同一个Integer实例,所以"i1==i2"结果为true.第四条语句由于128不在-128~127范围内,所以直接使用new创建新的Integer实例,同理,第五条语句也直接建立新的Integer类型,所以i1,i2指向的不是同一个Integer实例,结果为false。
Q7.package与javac、 java、 -classpath、 -d
在 com.ibm包中编写 StringUtil类,内有一方法
public static void foo1(){
System.out.println(StringUtil.class+" method:foo1");
}
在edu.jmu包中编写Main类,调用com.ibm.StringUtil的foo1方法
7.1 尝试用命令行进行编译并运行,截图
7.2 将生成的StringUtil.class放到d盘的lib目录下,将Main.class在d:\test目录下,尝试命令行下运行,截图。
7.3 Eclipse中源代码放在哪个目录、class文件放在哪个目录。在Eclipse项目中按一下ctrl+f11就可以直接运行Main,尝试分析背后实现的原理。
7.1
7.2
7.3
Eclipse中源代码放在src目录、class文件放在bin目录。
Q8.自己在这门课的目标与计划
请描述一下你的技术基础(会什么语言,都写了多少行代码)
一周准备花多少时间在这门课上?一周准备写多少行代码?采用怎样的学习方式?遇到困难打算怎样解决?
关于这门课的smart目标参考链接
答:(1)技术基础;C语言 (2)一周准备花一天半的时间在这门课上,一周准备写1000行代码,学完一个知识点自己敲一下代码运行一下,遇到困难可以借助百度搜索引擎或者请教同学、老师。(3)目标:掌握Java语言的基本用法,通过实验对所学知识进行巩固,学完Java语言,争取自己编写一个Java Web项目。
Q9.选做:公交卡里应该还有多少钱?请分析原因
3. PTA实验总结及码云上代码提交记录
3.1本周Commit历史截图
3.2 实验总结
实验碰到的问题、思考、收获与解决方案
实验碰到的问题:(1)打印斐波那契数列时输出格式错误,例如输入3,输出应为1 1 2(2)不确定search是在未排序的数组中查找还是在排序后的数组中查找(3)对字符串数组str进行排序,只需一行代码即可解决,我打了无数行。(4)打印乘法口诀时,输出格式错误,例如:2*1=2 2*2=4每一项之间,从前一个首字母算起到后一项首字母之间,包括空格总共有7个字符。(5)对两个浮点数进行精确计算,将这两个数定义为double型,先转成字符串型,再将字符串转成BigDecimal型,对其进行加法及乘法操作。
解决方案:(1)注意最后一个数字2后面没有空格,去掉2后的空格。(2)实践证明,search是在排序后的数组中查找(3)使用Array.sort(str)对字符数组进行排序。(4)使用"System.out.printf("%-7s",str);"形式输出(5)之间将两个浮点数定义为BigDecimal型。
收获:有些知识课上听懂了并不代表你就掌握了,真正要用的时候还是会犯各种各样的错误,掌握一个知识点最重要的还是要会运用。做题的时候要细心点,考虑问题要全面。