1. 本周学习总结
以几个关键词描述本周的学习内容。并将关键词之间的联系描述或绘制出来。
原则:少而精,自己写。即使不超过5行也可,但请一定不要简单的复制粘贴。
- java数据类型:java数据类型分为基本数据类型和引用数据类型,其中布尔型为java特有的基本类型
- 字符串类型String:String类最常用的引用类型之一,是不可变的,对String类的任何改变,都是返回一个新的String类对象
- 字符串常量与字符串池:JVM为了减少字符串对象的重复创建,它维护了一个特殊的内存,这段内存被称为字符串常量池
- 装箱与拆箱:装箱就是把值类型转换成引用类型,反之就是拆箱
- 动态数组:无法存放基本数据类型,只能存放引用类型
- StringBuilder对字符串进行修改。
书面作业
String-使用Eclipse关联jdk源代码1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串?
- 源代码如下:
- String实际上是用字符数组来存储字符串。
1.2 分析其构造函数public String(char value[])的作用?
- 用Char数组来存放String对象。如
String str = "12";
相当于char a[] = {'1','2'};
String str = new String(a);
。
1.3 阅读public String replace(char oldChar, char newChar)方法的代码,回答String的不可变性在该函数中如何体现?(重点)
- 如果oldChar字符串在String对象中没有出现,就返回在此 String 对象中的引用。否则创建一个新的对象,这个对象只是将所有的oldChar替换成newChar,其他与String对象相同。在这个过程中是创建了一个新的对象,oldChar替换成newChar这一动作并没有指向原来的String对象。
1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
- 字符数组是char型的,String中的每一个元素都是char,它是char型数组的封装,有函数可以用,比如
substring()
,这就为我们节省了不少时间。
StringBuilder
2.1 结合PTA -2(StringBuilder),说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
- String是固定不变的,在进行字符串连接的时候要新建一个字符串然后赋值,如果对String赋值多次,就会在内存中保存多个这个对象的副本,浪费系统空间。而StringBuilder是可变的,不用生成中间对象,不浪费空间。
2.2 阅读jdk文档,查询StringBuilder的append(char[] str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[] str)方法时,是如何实现添加字符的操作?
- 功能:将char数组参数的字符串表示形式追加到此序列。
- StringBuilder内部使用字符数组来存放字符。
- 将数组参数转换成字符串,然后按顺序将其追加到序列中,这个序列的长度增加。
字符串与字符串池
3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2); - 答:输出true。这段代码创建了两个字符串对象。在执行
String str1 ="hi";
时,在常量池中无法找到,于是创建一个"hi"对象;在执行str2="hi";
时,由于执行String str1="hi";
语句时已经创建过"hi",所以直接从常量池中引用,不用创建,在执行String str3 = new String(str1);
System.out.println(str1==str2);
时又新建一个对象,共两个字符串对象。
3.2 重点:对基本类型我们可以使用==比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用==比较?应该怎样比较他们的值是否相等呢?
- "=="是用来比较两个字符串的存储地址是否相同的,如果两个相同的字符串放到不同的地址时,使用"=="来比较就有可能出错,所以要用equals来比较。
Wrapper(包装类)
4.1 Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?
- 因为自动装箱可以将值类型转换成引用类型,所以可以将100赋值给i;这串命令包含了自动装箱和自动拆箱。
4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
- 因为基本数据类型之间的相互转换不是都可以实现的,包装类可以方便的实现基本数据类型之间的转换。
- 包装类整合了很多函数,在编写代码过程中我们可以直接调用。
实验总结
5.1 结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目。
- 队友:肖文婷
- 题目:身份证排序
- 这是我们第一次结对编程,过程很艰难,也遇到了不少问题。因为两个人思路不一样,但是轮到你的时候你又要把队友的代码看懂,按照她的思路去往下想,可能你好不容易勉强写了一部分,队友又发现她接不下去你的思路……我们就是这样的……然后我们就换了一个方法,先统一一个思路再轮流往下编。时间花得比一个人做要多,目前来说还没有做到1+1>2的效果,但是也不是没有收获,在这个过程中我听到了队友不同的想法,还有我卡住的地方也得到了队友的帮助,还是很不错的。
5.2 PTA-1综合小测验
- 用switch语句来实现功能的选择,斐波那契数列和排序以及查找都是调用函数实现的依次调用
fib(n)
、convertToIntDigits(strDigits)
、Arrays.sort(digits)
等函数,然后用System.out.println(ids[i].substring(6, 10)+"-"+ids[i].substring(10, 12)+"-"+ids[i].substring(12, 14));
语句来实现身份证中出生年月日的截取和输出。
5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
- 出生日期的截取和输出与5.2相同,如果需要降序的话就修改冒泡法中的交换条件;若要按照其中的出生年月排序,就类似PTA第二题,将出生年月截取出来进行排序后输出即可。
5.4 PTA-4动态数组
- 使用动态二维数组来存放乘法表,用嵌套for循环完成,最后使用
Arrays.deepToString
输出。
5.5 (重点:小测题目)PTA-8 ArrayList入门。并回答:为什么有了数组还要使用ArrayList?
- ArrayList可以改变大小,也就可以动态增添或删除数组中的元素,判断数组是否为空等。而且实现这些功能的方法都是可以直接调用的额,比较方便,如:
remove (int index)
移除指定位置上的元素、isEmpty()
如果列表中没有元素,则返回true等。
选做:公交卡里应该还有多少钱?请分析原因
1.png
3. 码云及PTA
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”,然后搜索并截图
3.2 截图题集“Java基本语法”PTA提交列表
3.3 使用老师发的jar程序统计每周的代码量