1. 本周学习总结
- 本周学习了类stringbuilder,Arrys,ArrysList的用法。
- 在写pta编程时复习了排序。但同时了解到在java中数组的排序可以用
Arrays.sort()
来实现。 - 写程序时经常出现输入后显示错误的情况,通过百度找到了原因是数组越界和存在空指针。
2. 书面作业
1. String-使用Eclipse关联jdk源代码
1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串?
- String使用
private final char value[]
来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,所以String类型是不可变的。
1.2 分析其构造函数public String(char value[])的作用?
public String(char value[]
是用法是将输入的char(字符型)数组转化成String(字符串型)变量。
1.3 阅读public String replace(char oldChar, char newChar)方法的代码,回答String的不可变性在该函数中如何体现?(重点)
public String replace(char oldChar, char newChar)方法的代码,回答String
使用后将原字符oldChar替换成新字符newChar,替换后生成的新字符串,而不是将原字符串改变,所以这个函数体现了String的不可变性。
1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
- 字符串是类,字符数组是数组。因此字符串在java中有很多操作是字符数组无法实现的。
- 字符数组是char型的,字符串是String型的。
2. StringBuilder
2.1 结合PTA -2(StringBuilder) ,说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
- 频繁修改字符串时,如果用String,由于String的不可变性,会生成大量的新的字符串到变量池中,造成内存的大量浪费,而用StringBuilder就不会出现这样的情况。
- StringBuilder拥有例如
StringBuilder.append
这类的函数,更方便操作。
2.2 阅读jdk文档,查询StringBuilder的append(char[] str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[] str)方法时,是如何实现添加字符的操作?
StringBuilder.append(char[] str)
将 char型的str数组参数的字符串表示形式追加到原序列。- 与String不同,StringBuilder是通过字符串存放字符的。
- 先使用 String.valueOf(char[]) 方法将参数转换为字符串,然后将所得字符串的字符追加到此字符序列。
3. 字符串与字符串池
3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2);
- 输出字符串池中str1与str2共同指向的对象。
- 这段代码创建了2个字符串对象。
3.2 重点:对基本类型我们可以使用==比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用==比较?应该怎样比较他们的值是否相等呢?
- 不能使用==比较的原因是:引用类型用==比较就是用于比较两个引用类型变量存放的引用是否相等,而不是值是否相等。
- 应用equals进行比较。
4. Wrapper(包装类)
4.1 Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?
Integer i = 100;
实际上是Integer i = new Integer(100);
的另一种语法,这种语法叫自动装箱。- 包含了自动窄巷操作,
int y = x+1;
是将Integer自动转换成int型。
4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
- 实现基本类型之间的转换.
- 便于函数传值.
- 就是在一些地方要用到Object的时候方便将基本数据类型装换.
5. 实验总结
5.1 结对编程实践:使用结对编程的方式完成本周编程题目,
5.2 PTA-1综合小测验
- 用switch进行选择进入对应程序。
- 在写fib函数时,曾想过用循环输出的方法,但是觉得太麻烦就依然使用数组进行储存和输出。
- 写sort函数时,用到了
Arrays.sort(digits);
的排序方法。避免了用冒泡法那么麻烦的方法。 - 在写getBirthDate函数时,当时想把所有语句直接放在主函数中,但是总是现实我数组越界,在舍友的提醒下编写了另一个函数用来将输入的身份证号转化成对应年-月-日的形式,返回值为年-月-日(String型)。
- 在本机上运行是没有问题的,交到pta平台上显示我fib输出格式错误,还没弄懂究竟是哪里出错。
5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
- 使用综合小测试使用的getBirthDate函数,将身份证号进行分解为年-月-日类型存入字符串数组str中。并新定义一个字符串数组date,存放年月日八位数。
- 对于sort1,直接使用
Arrys.sort()
,对字符串数组str进行排序。 - 对于sort2,对date数组进行冒泡法排序,其中比较大小时需要定义新的int型变量,数值由date数组强转而来。最后输出冒泡排序后的结果。
- 需要进行降序排序,可以反向输出排序后date数组的值。若按出生月份排序,则定义的int型变量取date数组中的第5位第6位,重新进行冒泡比较排序。
- 遇到的问题:
- 最初忘记用了
Arrys.sort()
,选循环将年月日分开来分别比较取出年龄最大的输出,再继续循环直到结束。给我的启示是我需要更加了解jdk的使用,否则编程难度会大大增加。 - 冒泡排序时需要新定义int型变量,来进行比较,最初直接用String型比较出了很多问题。
5.4 PTA-4动态数组
- 首先需要一个
getDynamicMatrix(int n)
函数,该函数的作用是为第n行的数组分配n个大小的空间。 - 进入两层for循环,令str[i][j]=i"j"="ij,并输出直到i==j,此时需要换行。
- 运用
Arrays.deepToString(str)
进行输出。 - 遇到的问题:
- 在循环输出str时,当i不等于j时中间是需要有空格的,最初自己输出了单纯的空格字符,后来舍友告诉我输出时用
System.out.printf("%-7s",str[i-1][j-1]);
就可以了。 - 最初不知道
Arrays.deepToString(str)
的用法,是询问舍友知道的。
5.5 (重点:小测题目)PTA-8 ArrayList入门。并回答:为什么有了数组还要使用ArrayList?
- 需要用到类ArrayList。
ArratList.contains()
strlist.indexOf()
strlist.lastIndexOf()
strlist.get()
等等用法。需要自己记住。 - 自己的代码测试是正确的,交上pta显示答案错误。经过检查发现是遍历strList,将字符串中包含str的元素放入另外一个ArrayList strList1.输出strList1时字符串没有完成复制,但是自己的方法出了变量和舍友不同其他都相同。所以我有个疑问就是变量名过于复杂是否会影响程序运行?
- 遇到的问题:这题变量太多,第一次打的时候没有区分开各个变量导致程序有很多bug,我觉得变量的命名也不能太随意。
5.5 选做:5-5(浮点数计算), 5-6(枚举), 5-7(大整数相加)
- 选做:公交卡里应该还有多少钱?请分析原因
3. 码云及PTA
3.1. 码云代码提交记录
• 在码云的项目中,依次选择“统计-Commits历史-设置时间段”,然后搜索并截图
第二次使用,命名出现错误,请老师谅解。
3.2 截图题集“Java基本语法”PTA提交列表
3.3 使用老师发的jar程序统计每周的代码量
当前为第一次统计
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
2 | 308 | 308 | 7 | 7 |