1. 本周学习总结
·学习了String类的特点,以及其与字符数组的关系等等。
·常量池的相关概念。
·包装类的特点。
2. 书面作业
1. String-使用Eclipse关联jdk源代码
1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串?
如图所示,String实际上是使用char[]
来存储字符串。
1.2 分析其构造函数public String(char value[])
的作用?
查阅JDK文档
public String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。该字符数组的内容已被复制;后续对字符数组的修改不会影响新创建的字符串。
参数:
value - 字符串的初始值
将当前字符数组中的字符放入新创建的字符串中,但该字符数组依旧存在。
1.3 阅读public String replace(char oldChar, charnewChar)
方法的代码,回答String的不可变性在该函数中如何体现?(重点)
//申请一个和原来字符数组一样大小的buf数组。
char buf[] = new char[len]; ```
在该函数中是先创建了一个新的字符串数组,然后将字符替换并复制到新数组后,将构造的新字符串对象返回。所以实质是创建了一个新的String对象,而不是在原字符串中更改。
###1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
String本质上是使用字符数组存储字符串;String创建对象后是不可变的,字符数组可以改变。直接赋值定义一个String对象时,会将改字符串入字符串常量池,等下一次再定义相同的String对象时就不会再开辟一个新的空间,节省空间,效率高。
##2. StringBuilder
###2.1 结合PTA -2(StringBuilder) ,说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
如果使用String的话,因为String的不可变性,每修改一次字符串,就会创建新的String对象,产生大量的String对象,占用大量空间。StringBuilder是将字符串追加或插入到字符串生成器中。
###2.2 阅读jdk文档,查询StringBuilder的`append(char[] str)`方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的`append(char[] str)`方法时,是如何实现添加字符的操作?
功能:将 char 数组参数的字符串表示形式追加到此序列。
StringBuilder内部使用字符数组来存放字符。它是通过将字符参数转化为字符数组添加到原序列后实现添加字符的操作。
> 该方法的最终效果与以下操作过程的效果相同:先使用 String.valueOf(char[]) 方法将参数转换为字符串,然后将所得字符串的字符追加到此字符序列。
##3. 字符串与字符串池
###3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
`String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2);`
输出结果:true,创建了两个字符串对象。
解释:直接赋值定义str1,该字符串会存入字符串池中,当str2被直接赋值定义后,字符串池中已有该字符串,所以不再重复创建新的对象。而str3是采用`new String()`的方式定义的,所以新创建了一个字符串对象。
###3.2 重点:对基本类型我们可以使用==比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用==比较?应该怎样比较他们的值是否相等呢?
因为==比较的是是否为同一个对象,而不是比较两个值。应该用equals方法,如`String str=new String("hi");str.equals("hi");`不区分大小写进行比较:`"abc".equalsIgnoreCase("ABC");`
##4. Wrapper(包装类)
###4.1 `Integer i = 100;`//100是基本类型,i是引用类型,为什么可以将100赋值给i?`Integer x = 100; int y = x+1;x++;`这一串命令中包含了些什么操作?
因为包装类可自动装箱、拆箱。
`Integer x = 100`自动装箱,将基本数据类型100转换为Integer类型;`int y = x+1`自动拆箱,将Integer类型x转换为基本数据类型y;`x++`则是先拆箱再装箱。
###4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
包装类可以实现基本数据类型之间、基本数据类型和String之间的转换,而且可以将基本数据类型封装成对象,毕竟Java是面向对象的语言,所以许多地方都是需要用对象。
##5. 实验总结
###5.1 结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。
结对对象:秦玉
就近选择舍友作为合作方,步骤1、2进行得还是比较顺利的,但从步骤3开始,两人讨论过程中发现两个人思路、编程习惯大相径庭,确实不太适合一起编程,所以我们决定用各自的方法进行编程,结束后再做交流,互相吸取对方方法的优点。个人认为,就这次的体验,觉得确实没有产生1+1>2的效果,不过各自编程后进行交流总结的这个过程倒是觉得有所收益,确实开拓了编程思路。
###5.2 PTA-1综合小测验
该题中,斐波那契函数部分基本和以前用C语言编写的差不多,就不多说了,注意输入的n可以小于3;sort部分使用`split()`函数去掉空格,再自己编写函数将字符串数组转换成整型数组,然后使用`Arrays.sort()`进行排序,最后使用`Arrays.toString`输出即可;search部分会使用`Arrays.binarySearch(int[] a, int key)`即可;getBirthDate部分使用`substring()`方法,要注意参数的选取。
###5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
sort1部分类似与综合小测验中的截取年月日的部分,只不过再对其进行排序,使用`Arrays.sort()`方法即可;sort2的话跟以前写C语言的时候的一些题目差不多,可以利用冒泡法进行排序,如果要降序的话就把冒泡法里的判断条件更改一下就行了。
###5.4 PTA-4动态数组
这题的话比较基础,注意一下输出格式就行了。
###5.5 (重点:小测题目)PTA-8 ArrayList入门。并回答:为什么有了数组还要使用ArrayList?
这题其实也不难,题目里已经列好了操作的步骤,只要把这些步骤转化成代码即可。用JDK文档查询ArrayList类的相关方法,根据步骤要求使用这些方法就能编写出来。比较值得注意的就是步骤12,一开始将strlist里的元素转化成字符数组和str进行比较,出现空指针的错误,反复尝试后发现其实只要将每个元素转换成字符串然后用`indexOf()`方法比较即可orz想得太复杂了。
使用ArrayList可以灵活改变容量长度,有点像C中的分配动态空间。
#3. 码云及PTA
##3.1. 码云代码提交记录
![](http://images2017.cnblogs.com/blog/1123113/201709/1123113-20170923172606915-1577453550.png)
##3.2 截图题集“Java基本语法”PTA提交列表
![](http://images2017.cnblogs.com/blog/1123113/201709/1123113-20170923172019321-1962675670.png)
![](http://images2017.cnblogs.com/blog/1123113/201709/1123113-20170923172028056-996085489.png)
##3.3 使用老师发的jar程序统计每周的代码量
|行数|新增行数|文件数|新增文件数|
|-:|-:|-:|-:|
|247|247|76|76|