201621123011《Java程序设计》第二周学习总结
1. 本周学习总结
- 即使两个引用类型指向的数据相同,它们两个也不能用==相连。
- 学会了一些String函数的用法。
- 字符串池中若没有需要的字符串,则会新创建一个字符串常量放到字符串池中。
2. 书面作业
1、String-使用Eclipse关联jdk源代码
1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串?
- String是使用数组来储存字符串的。
1.2 分析其构造函数public String(char value[])的作用?
该函数的作用是通过char数组,生成String字符串对象,接口中的参数是一个char数组。
1.3 阅读public String replace(char oldChar, char newChar)方法的代码,回答String的不可变性在该函数中如何体现?
- 这个方法返回 newChar 更换 oldChar 所有出现在此字符串中产生一个新的字符串。
1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
- String与字符数组二者可以互相转换。
- String将所有的内存操作全部包装起来,使用的时候可以不用考虑字符串的长度,也不用自己申请和释放内存。
2、StringBuilder
2.1 结合PTA -2(StringBuilder) ,说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
- String具有不可变性,每修改一次字符串,就会申请新的内存空间,而原字符串的内存占用空间不会被清除,所以频繁地修改字符串,会占用大量的内存空间,因此,频繁修改字符串时,应该使用StringBuilder而不是String。
2.2 阅读jdk文档,查询StringBuilder的append(char[] str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[] str)方法时,是如何实现添加字符的操作?
- StringBuilder的
append(char[] str)
方法功能是将 char 数组参数的字符串表示形式追加到此序列。 - StringBuilder内部使用字符串数组来存放字符。
按顺序将数组参数中的字符追加到此序列中。此字符将增加该参数的长度。
3、字符串与字符串池
3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2);
- 结果为
true
,这段代码创建了两个字符对象,先在字符串池中创建一个hi
,让str1指向它,接着创建str2时,会在字符串池中搜索,若搜索到hi
,就会直接让str2指向它,若未搜索到,才会新建一个hi
,str3则是用new新建一个字符串对象。
3.2 重点:对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?
- 因为引用类型的变量名并不是直接指向它所对应的数据的,所以不能用==比较。
- 用a1.equals(a2)可以比较两个变量的值是否相同(a1,a2均为变量)。
4、Wrapper(包装类)
4.1 Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?
- Integer自动装箱,给i包装了一个int基本类型,所以可以直接给i赋值100,
- (1)自动装箱,将int型转成Integer型
(2)自动拆箱,将Integer型转成int型
(3)先拆箱后装箱。
4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。
5、实验总结
5.1 结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2.1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3.5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。
- 队友:江炳煌。
- 我们在结对解决问题的时候,只要任何一个人有想法,就立马提出,然后两个人再讨论想法的可行性,我们在打代码的过程有交替的行为,但是并不频繁,因为每交换一次就要重新理解,比较麻烦。
- 我同意1+1>2,但是我个人觉得两个人交替打代码的效率不是很高,可能是因为我比较喜欢先一个人打代码,然后在遇到不懂的问题时先查阅资料再询问同学,这样我的印象会比较深刻。
5.2 PTA-1综合小测验
- 大部分都是细节上的问题,像fib只需要一个简单的递归就能解决,而sort输出需要有
[]
,我不知道要如何解决这个问题,于是就询问了同学,才知道有个函数System.out.println(Arrays.toString(a));
可以直接输出并附带[]
。
5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
- 这道题是PTA上第一题的小变体,我是将出生年月日依次比较,年相同则比较月,月相同则比较年,使用的是冒泡法进行排序。sort2降序排序的话只需要反过来用冒泡排序法即可,若是要按照出生月份排序的话可以用
a[i].subString(10,12)
提取出月份,然后比较排序。
3. 码云及PTA
3.1. 码云代码提交记录
3.2 截图题集“Java基本语法”PTA提交列表
3.3 使用老师发的jar程序统计每周的代码量
- 不知道是什么原因,我的程序无法打开,所以统计不了代码量。