201621123040《Java程序设计》第2周学习总结
1.本周学习总结
-
关键词:Java中的字符串与数组 c语言基本语法的迁移
-
相关总结:在一周的学习过程中,我自主学习Java的基本语法,前期的相关语法与c语言的基本语法相近,也算是做到了很好的回顾;在郑老师的课上着重的学习到Java基本语法中的字符串与数组;我了解到java中的字符串String类具有不可变性;Java即已是面向对象的语言,在String类中存放并非是字符串对象,而是指向相关对象的引用;Java中的null并非同c语言中一样等于0,而是未分配内存;至于数组,从一维、二维向动态数组
ArrayList
的过渡,习得与c语言的数组相差甚多的基本语言(例:foreach实现数组的遍历)。
本周的Java学习内容丰富,需要将Java基本语法做到很好的吸收!
2.书面作业
2.1String-使用Eclipse关联jdk源代码
2.1.1查看String对象的源代码(截图),分析String使用什么来存储字符串?
- String使用char value[] 字符数组来存储字符串
2.1.2分析其构造函数public String(char value[])的作用?
- 利用一个已经存在的字符数组的内容来初始化新建的String对象。在操作过程中,把字符数组中的值复制导对象中,操作字符数组不会对字符串产生影响。(String的不可变性)
相关内容通过查阅图书获得
2.1.3阅读public String replace(char oldChar, char newChar)
方法的代码,回答String的不可变性在该函数中如何体现?(重点)
- 通过newChar替换此字符串中出现的所有oldChar得到的字符;实现这一替换函数的实质还是创建一个新的String对象,进而实现替换功能,原先的对象内容依旧存在,由此体现String的不可变性
2.1.4简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
-
字符数组是字符数据类型的集合;字符串是字符的序列,某种程度上类似于字符数组
-
在界面呈现文本内容的时候,用的是String的形式;String用于文本表示,这正是我们所需要的
2.2StringBuilder
2.2.1结合PTA 5-2(StringBuilder) ,说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
- StringBuffer类的对象是可变的字符序列,即动态对象,动态修改;而String每次修改字符都是一次新建对象,占据存储空间多,编译速度加剧变慢;故而在频繁修改字符串时(数据量大的情况下),使用StringBuilder比String更有优势
2.2.2阅读jdk文档,查询StringBuilder的append(char[] str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[] str)方法时,是如何实现添加字符的操作?
append(char[] str)
实现字符串的追加
-
StringBuilder内部使用字符串String来存放字符
-
new StringBuilder().append(源字符串).append(需要添加的新字符串).toString()
实现左右两边字符的相加,最后转换为toString()返回
2.3字符串与字符串池
2.3.1尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2);
- 在字符串池中有了"hi"这个字符串对象,str1和str2共同使用"hi",本题输出结果应该是true;而str3是再建对象,故而在这段代码中创建了2个字符串对象。
2.3.2对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?
- 在引用类型中比较的是对象相应的地址,因而创建不同的引用对象相应的地址自然不同,故不适用引用类型的比较;可以通过使用
public boolean equals()
实现字符串对象间的比较。
2.4Wrapper(包装类)
2.4.1Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?
-
这实现了i的自动装箱,相当于执行了
Integer.valueOf(100)
; -
Integer x = 100
实现x的自动装箱;int y = x+1
先实现x自动拆箱,再进行x+1加法运算;x++
先实现x的自动拆箱,再进行x的自加运算。
2.4.2Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
- 通过包装类(即对象)更加体现Java面向对象的特点;包装类的自动装箱和自动拆箱实现代码的简化,方便编译。
2.5实验总结
2.5.1结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。
- 结对队友:普天
- 结对过程:首先是编程分块安排(综合小测代码题),我主要负责的是第二、三块,普天同学负责第一、四块;第一块通过c语言语法迁移,使用递归函数,普天同学在我的帮助下较快的完成fib函数块(主要花费的时间在于正确的格式输出),在他进行第四块的过程中,我们交换思路,求同存异,通过查阅java中截取字符串函数的相关语法,普天同学负责的部分在将近40分钟内得以实现;那至于我负责的部分则些许波折,首先是查阅信息准确性的失误(例:在实现[]包裹打包使用的相关语法上的使用便存在想法差异),以及字符串转换成Integer类的过程使用循环遍历函数的写法格式上存在疑惑,最后花费较长的时间完成二三两块。
- 结对体会:结对完成代码与独立完成在时间有些许的缩减;但在配合过程中也存在争论,到底哪种方法更合适本道题,双方意见起初的不一致也造成一定时间的浪费,不过在编译过程中我们的交流磨合最终实现代码的运行,我们意识到团队协作的意义所在:完成一个项目不是靠一个人单打独斗,在合作中我们要接受不一致,求同存异,吸纳对方编译思想的优越性,让我们今后的编译思维更加开阔;由于本次是初次合作,还未真正能体现"1+1>2",希望在以后的合作中能够更加体现。
2.5.2PTA-1综合小测验
- 对于本题,首先要确定框架(switch....case....),在逐步实现每一块相关代码的码入;
第一块(fib):输出斐波那契数列,通过c语言知识迁移使用递归算法实现第一部分;
第二块(sort):本块主要使用到Array.sort()
实现对输入数字(其中需要要实现字符串向Integer类的转换,通过for循环遍历实现,第三块通用)的排序,本块最值得注意的是要实现打包输出;
第三块(search):第三块与第二块彼此衔接,在排好数字顺序的前提下,使用Arrays.binarySearch( , )
实现查找功能,最后再使用if判断按要求输出;
第四块(getBirthDate):本块主要使用到字符串的截取,先截取出身份证号码的生日部分(第七位-第十五位),进而重构新的关于生日的字符串,在相应位置添加"-"(第五位、第七位),最后输出这一重构字符串完成本部分。
2.5.3PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
- 本题的第一部分sort1与综合小测编程题相似,实现生日相关位置字符串的截取,进而实现字符串的转换,再使用
Arrays.sort()
进行排序;对于第二块,犹豫、测试花费的时间是最久的,通过参考吸收同学sort2部分的代码,得到启发:可以使用冒泡法(前期截取方法与sort1相似)实现身份证生日的排序,且得到整个身份证的输出;由此同理,仍可以使用冒泡法实现降序排序。
2.5.4PTA-4动态数组
- 对于本题,首先嵌套了老师上课的基础模板,实现最终
Array.deepToString()
的输出;进而就要实现九九乘法表的相关输出,通过c语言的知识迁移,两个for循环的嵌套使用得以实现(for(int i=0;i<n;i++)
for(int j=0;j<i+1;j++)
),最后使用二维动态数组将其存储,实现九九乘法表的输出;本题出现最大的问题在于九九乘法表的格式输出,本题不能使用System.out.println()
,而应该使用System.out.printf()
。
- 通过吸收了解同学提交的正确格式代码,那么其中就要对结果输出作特殊处理:当每行的末尾乘法口诀(j=i),正常输出;其余的乘法口诀,可以采用左对齐的输出格式("%-7s"左对齐七个字符),比如12=2占五个字符,左对齐后还空余两个字符;当然25=10此时占六个字符,左对齐后还空余一个字符;故而左对齐七个字符是最佳的对齐形式。
2.5.5(重点:小测题目)PTA-8 ArrayList入门。并回答:为什么有了数组还要使用ArrayList?
-
本题ArrayList入门,要严格按步骤进行,期间要使用字符串的插入(头插与尾插也是存在差异的
str.add()
,str.add(0, "begin")
)、字符串的查询(从头到尾与从尾到头的查询也是存在差异的str.indexOf()
,.lastIndexOf()
)、字符串的移除(str.remove()
)以及动态数组内容的清空(str.clear()
);对于我来说,本题的代码训练意义在于了解ArrayList动态数组中的相关操作语法的习得与训练。 -
数组的长度由编译者创建该数组便确定好了,且不再发生改变,反观ArrayList为动态数组,它的储存容量实现动态变化,便于实现各种操作。
2.5.6选做:5-5(浮点数计算), 5-6(枚举), 5-7(大整数相加)
-
对此,我只完成了5-5(浮点数计算),5-7(大整数相加)。
-
5-5 对于本题,首先要知道两个浮点数Double型的直接相加/相乘是达不到精确的效果(例:1.0-0.1=0.899999)
这个方法并不适用;通过查询资料可知,java中对于浮点数的计算可以调用BigDecimal();先创建两个字符串(浮点型)
,再而创建两个BigDecimal()实现对两个字符串(浮点型)的迁移,最后创建BigDecimal add
、BigDecimal mul
实现两个BigDecimal的add算法与multiply算法,最后输出BigDecimal add
、BigDecimal mul
即可。 -
5-7 对于本题,与5-5有共通之处,首先要知道int型的计算范围远远小于本题大整数的范围(int 范围为-2,147,483,648~2,147,483,647),这个方法也不适用;通过查询资料可知,java中对于大整数的计算可以调用BigInteger(),但是本题不仅仅只是两个数的相加,可以实现多个大整数的累加(遇到"e"/"E"方才停止累加),故而要套用循环
while(!a.equals("e")&&!a.equals("E")
,首先创建字符串,进而实现字符串向BigInteger的迁移,重要的是起初要创建一个BigInteger,使其的初始值为"0",再实现大整数的累加。
2.6选做:公交卡里应该还有多少钱?请分析原因
- 这张公交卡应该是已经欠款了;公交卡的充值上限在1000左右,出现4千多万的公交卡应该是因为卡内余额不足(<0)不符合刷卡系统的操作范围,故而溢出出现乱码。
3.码云及PTA
3.1码云代码提交记录
3.2截图题集“Java基本语法”PTA提交列表
3.3使用老师发的jar程序统计每周的代码量
|-周数-||-总代码量-||-新增代码量-||-总文件数-||-新增文件数-|
:---😐:---😐:---😐:---😐:---😐:---😐:---😐:---😐:---😐:---😐:---😐
|2||304||304||9||9|