201621123013 《Java程序设计》第2周学习总结
1.本周学习总结
关键字:
·String类特点和StringBuilder类
·包装类(自动拆箱和自动装箱)
·foreach循环(一维数组中)
·基本使用ArrayList动态数组
2.书面作业
1.String-使用Eclipse关联jdk源代码
1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串?
答:String使用字符数组来存储字符串。
1.2 分析其构造函数public String(char value[])的作用?
答:通过字符数组,再生成一个String对象。
1.3 阅读public String replace(char oldChar, charnewChar)方法的代码,回答String的不可变性在该函数中如何体现?(重点)
答:在字符串替换时,是再创建一个新的字符串,然后返回这个字符串的字符串常量,而不是直接对原有的字符串进行操作,所以原字符串不会发生改变(不可变性)。
1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
答:二者关系:String是String类的对象,而字符数组就是数组,String就相当于是将字符数组装起来。在有些时候,比如需要频繁修改字符串的时候,我们就使用字符数组会比较好,不会造成空间浪费,而在需要用到String的不可表性时,就用String比较简便,各有特点。
2.StringBuilder
2.1 结合PTA -2(StringBuilder),说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
答:因为String的不可变性,每次修改就会产生新的对象,当我们频繁修改时就会生成大量的对象,当许多对象没有被调用的时候就会影响效率和造成资源的浪费。而StringBuilder,只是对自己本身进行操作,不会产生新的对象,所以频繁修改字符串时,应该使用StringBuilder而不是String。
2.2 阅读jdk文档,查询StringBuilder的append(char[]str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[] str)方法时,是如何实现添加字符的操作?
答:1、功能是添加这个字符数组参数的表示形式到对应的序列中去。
2、使用字符数组存放字符。
3、将字符数组中的参数有序地添加到此序列中,这个序列的长度相应地增加参数的长度。
3.字符串与字符串池
3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi", str2="hi";
String str3 = new String(str1);
System.out.println(str1==str2);
答:
1、结果为:true
2、共创建了两个字符串对象,str1和str2都是指向同一个内存地址的,故可以知道他们为同一个对象,而后面通过new
又创建了新的对象str3,所以总共有两个。
3.2 重点:对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?
答:我们要比较两个值是否相等,得判断是“”还是“equals”。“”比较的是内存地址是否一样,而“equals”比较的是内容是否一样。
4.Wrapper(包装类)
4.1 Integer i =100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?
答:
1、因为Integer是int的包装类,就会有自动拆箱功能,因此可以将100赋值给i。
可以将100赋值给i。
2、Integer x = 100;
int y = x+1;``x++;
第一句包含自动拆箱;第二句包含自动装箱;第三句就是先拆箱后装箱(上课有讲)
4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
答:从一开始的概念出发,java是一种面向对象的语言,而且包装类能实现和String以及基本类型的转化,而且包装类能很明显地带给我们很大的便利。
5.实验总结
5.1 结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。
答:结对队友:郑鑫煌。a.一开始判断题目,讨论了我们想法,交换了我们的思路之后,我先开始写代码,队友开始用手机和java书开始查阅相关资料,按照步骤,我们简单地讨论之后,他还是有点不能接受,之后再给他认真讲解我的代码和具体想法,再经过我们的努力还是解决了一些问题 b.对于我个人来说呢,我比较喜欢自己审题,做题,然后遇到一些问题,自己查资料或者百度,因为每个人对于题目的见解都会不同,第二个人的思路很有可能被第一个人给思维定式住(要继续打下去),我觉得这样不利于编程能力的提高,独立思考,自行解决问题的能力非常重要对于我们来说,也不利于我们开拓编程思路。
5.2 PTA-1综合小测验
答:其中fib
函数就用到了简单的递归即可,而sort
函数需要用到一些函数比如split
函数,而search
函数就要用到上一个sort
函数,最后一个就是getBirthDate
函数,其中用到了substring
函数(自己查资料获知),个人觉得本题思路比较清晰,就是繁琐了一点,可是我还是遇到很多问题,看起来虽然清楚,但是实践就会碰壁,虽然自己pta还未编译成功,但是我还是会去请教能力强的同学来帮忙。
5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
答:这也有用到第一题中的getBirthDate
函数的思想,但是还是考虑到升序的问题,将年月日字符转化为数组,然后用冒泡法就可以了。降序就是反过来比较就可以的。
6.PTA截图
7.码云
关于代码统计,用不了(舍友也是),很抱歉。问题:显示的代码量为0,可是明明有代码,也不懂为啥(还是可能是我自己输入有错?)